<?php

class BizonylatokController extends AppController {

	var $name = 'Bizonylatok';
	var $components = array('RequestHandler', 'Cegosztaly', 'Igazgatosag');
	var $uses = array('Bizonylat', 'Szamlaegyenleg', 'Arfolyam', 'Lekerdezes', 'Szamla', 'Naplo');
	var $paginate = array(
		'limit' => 25
	);

	function isAuthorized(){
		if($this->Auth->user('csoport') == 1){		//admin jogosultságú júzerek
			return true;
		}
		elseif($this->Auth->user('csoport') == 2){	//könyvelők
			return true;
		}
		elseif($this->Auth->user('csoport') == 3){	//betekintők
			if(in_array($this->request->action, array(
														'index',		//a listában új heyett módosító linket adunk, kezelve a viewben
														'modosit',	//módosítás nincs engedélyezve csak betekintés. kezelve a viewben
														'lekerdezes',
														'setSessionDatum',
														'penzkeszlet',
														'cashstate',
														'beszamolo',
														'ue',
														'kt',
														'tenytotal',
														'naplolista'
														)))
				return true;
			}
		elseif($this->Auth->user('csoport') == 4){	//osztalyvezető
			if(in_array($this->request->action, array(
														'index',		//a listában új heyett módosító linket adunk, kezelve a viewben
														'modosit',	//módosítás nincs engedélyezve csak betekintés. kezelve a viewben
														'lekerdezes',
														'setSessionDatum',
														'penzkeszlet',
														'cashstate',
														'beszamolo',
														'ue',
														'kt',
														'naplolista'
														)))
				return true;
			}
		return false;		//minden más tiltva
	}

	function beforeFilter(){
		parent::beforeFilter();
		//xlsx kezelés hozzáadása
		if($this->RequestHandler->ext == 'xlsx'){
			$this->RequestHandler->setContent('xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		}
	}

/**
 * Alkalmazás nyitólap
 * @return nothing
 */
	function index() {
		//die('index');
		//elérhető naplók típusonként
		$this->Bizonylat->Naplo->unbindModel(array('hasMany' => array('Bizonylat')));
		$this->set('naplok', $naplok = $this->Bizonylat->Naplo->find('all',
													array(
														'fields' => array(
															'Naplo.id',
															'Naplo.nev',
															'Naplo.sorszam',
															'Naplo.alapertelmezett_szamla',
															'Naplotipus.nev',
															'Naplotipus.kod',
															'Naplotipus.id',
															'Valuta.nev',
															'Valuta.id'
														),
														'conditions'  => array(
																				'Naplo.ceg_id' => $this->Session->read('Settings.cegId'),
																				'Naplo.ev' => $this->Session->read('Settings.ev')
																				),
														'order' => array('Naplotipus.sorszam', 'Naplo.sorszam')
													)));

		//ha a naplóhoz tartozik alapértelmezett számla, akkor kiírjuk az egyenlegét is
		//debug($this->Session->read('Settings'));
		//debug($naplok);
		$szamlaegyenlegek = $naploIdk = array();
		foreach($naplok as $n){
			$naploIdk[] = $n['Naplo']['id'];
			if($n['Naplo']['alapertelmezett_szamla']){
				$szamlaegyenlegek[$n['Naplo']['id']]['huf'] = $this->Bizonylat->Tetel->getEgyenleg($n['Naplo']['id'], $this->Session->read('Settings.ev'));
				if(!($n['Valuta']['nev'] == 'HUF' || $n['Valuta']['nev'] == 'Syama' || $n['Valuta']['id'] == 19)){
					$szamlaegyenlegek[$n['Naplo']['id']]['valuta'] = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($n['Naplo']['id'], $this->Session->read('Settings.ev'));
				}
			}
		}
		//debug($szamlaegyenlegek);
		$this->set('szamlaegyenlegek', $szamlaegyenlegek);
	}	

/**
 * napló alapinfók
 * @param int $naploId a bizonylat azonosítója
 * @return array(
 * 		'szamlak' => array(
 * 			'id' => '1',
 * 			'szam' => '0'),
 * 		'naplok' => array(
 * 			'nev' => 'Vegyes napló',
 * 			'sorszam' => '1'),
 * 		'naplotipusok' => array(
 * 			'nev' => 'Vegyes',
 * 			'kod' => 'E'
 * 			),
 * 		'valutak' => array(
 *	 		'nev' => 'HUF'))
 */
	function getNaploInfo($naploId){
		$alapInfo = $this->Bizonylat->query('SELECT szamlak.id, szamlak.szam,
															naplok.id, naplok.nev, naplok.sorszam,
															naplotipusok.nev, naplotipusok.kod,
															valutak.nev
												FROM naplok, naplotipusok, valutak, szamlak
												WHERE naplok.id = '.$naploId.'
												AND naplok.naplotipus_id = naplotipusok.id
												AND naplok.valuta_id = valutak.id
												AND naplok.alapertelmezett_szamla = szamlak.id');
		return($alapInfo[0]);
	}

/**
 * Mentett bizonylat megtekintése olvasásra és módosítása
 * @param int $id a bizonylat azonosítója
 * @return nothing
 */
	function modosit($naploid = null, $sorszam = null) {
		$osszegBizonylatig = $this->Session->read('Bizonylat.osszegBizonylatig');
		//hozzáférhető osztályok id-i
		$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		if(isset($this->request->data['Bizonylat']['sorszamKeres'])){
			//keresés után adott sorszámú bizonylatot kell megjelíteni
			$sorszam = $this->request->data['Bizonylat']['sorszamKeres'];
		}

		if($naploid && $sorszam){
			//napló fejléc
			$this->set('alapInfo', $this->getNaploInfo($naploid));
//debug($alapInfo);

			if(isset($this->request->data['Bizonylat']['bizonylat_id'])){
				//létezik a bizonylat_id tehát elküldött adatokat kaptunk, ezt a bizonylatot módosítjuk
				//le kell kérnünk a módosítás előtti tételeket, hogy lássuk mi változott
				foreach($this->request->data['Tetel'] as $t){
					$tetelidk[] = isset($t['id']) ? $t['id'] : null;	//ha új tételeket is adtunk hozzá, azoknak nem lesz id-je
				}
				//Debugger::log($this->request->data);
				$regiTetelek = $this->Bizonylat->Tetel->find('all', array(
																						'conditions' => array('Tetel.id' => $tetelidk)
																						)
																			);
				//Debugger::log($regiTetelek);
				foreach($regiTetelek as $regiT){
					/*a régi tételeket kiszedjük az egyenlegek tábla számából és később
					 betesszük az újakat így nem lesz kavarodás. Ez itt kiszedi az egyenlegekből
					 a régi összegeket
					 ha a tétel töröltnek van jelölve akkor ezt nem kel megtenni, mert eleve benne sincs az összege
					 az egyenlegben*/
					//$this->log('$regiT: ' . print_r($regiT, true), LOG_DEBUG);
					if($regiT['Tetel']['spec'] != 'd'){
						$tetel = array(
									'osszeg' => -1*($regiT['Tetel']['osszeg']),
									'szoveg' => $regiT['Tetel']['szoveg'],
									'sorszam' => $regiT['Tetel']['sorszam'],
									't' => $regiT['Tetel']['t'],
									'k' => $regiT['Tetel']['k'],
									'osztalyId' => $regiT['Bizonylat']['osztaly_id'],
									);
						$this->Szamlaegyenleg->frissit($tetel, $this->Session->read('Settings'));
					}
				}

				//pár adat nem kerül módosításkor elküldésre, de az _elokeszit() és a rogzit() metódusok megkövetelik a létüket
				$this->request->data['Bizonylat']['id'] = $this->request->data['Bizonylat']['bizonylat_id'];
				$this->request->data['Bizonylat']['naplo_id'] = $naploid;
				//todo: árfolyam kezelése
				$this->request->data['Bizonylat']['sorszam'] = $sorszam;
				//be kellolvasni a tételek id-it is, hogy ott is módosítás legyen hozzáadás helyett
				try{
					$this->request->data['ev'] = $this->Session->read('Settings.ev');
					$this->request->data['cegId'] = $this->Session->read('Settings.cegId');
					$this->request->data['userCsoport'] = $this->Session->read('Auth.User.csoport');
					$this->request->data = $this->Bizonylat->elokeszit($this->request->data);
					if($this->request->data){
						$this->Bizonylat->create();
	//die(pr($this->request->data));
						if($this->Bizonylat->rogzit($this->request->data, $this->Session->read('Settings'))){	//sikeres mentés
							if($this->RequestHandler->isAjax()){	//ajax hívás volt
								//valutás vagy HUF egyenleget számolunk?
								if(isset($this->request->data['Tetel'][0]['Valutatetel']['osszeg'])){
									$zEgyenleg = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($naploid, $this->Session->read('Settings.ev'), $osszegBizonylatig ? $this->request->data['Bizonylat']['id'] : null);
								}
								else{
									$zEgyenleg = $this->Bizonylat->Tetel->getEgyenleg($naploid, $this->Session->read('Settings.ev'), $osszegBizonylatig ? $this->request->data['Bizonylat']['id'] : null);
								}
								$zEgyenleg = number_format($zEgyenleg['tegyenleg']-$zEgyenleg['kegyenleg'], 2, ',', '.');
								$this->set('bizonylat', array(
																'ujzEgyenleg' => $zEgyenleg,
																'uzenet' => 'Sikeres módosítás'
																));
								$this->render();	//rendereljük le az ajax választ a sikeres rögzítésről
							}
							else	//nem ajax adatküldés volt ki vele a bizonylat főoldalra (kikapcsolt JS)
								$this->redirect(array('action'=>'index'));
						}
						else {	//sikertelen mentés
							if($this->RequestHandler->isAjax()){
								$this->set('bizonylat', array(
																'uzenet' => 'Sikertelen módosítás. rogzit() hiba'
																));
								$this->render();
							}
							else
								$this->Session->setFlash(__('The Bizonylat could not be saved. Please, try again.'), 'default', array('class' => 'alert'));
						}
					}
					else{	//_elokeszit false-t adott vissza
						throw new NotImplementedException('Sikertelen mentés: Valami kezeletlen elokeszit() hibára futottam!');
					}
				}
				catch(Exception $e){
					$this->set('bizonylat', array(
																'uzenet' => $e->getMessage()
																));
					$this->render();
				}
			}
			else{		//most jelenítjük meg a módosítandó bizonylatot nincs még elküldött adat
				//kérdezzük le a bizonylat id-jét

				//2-szeres rekurziót kell használni, ezért szépen lecsatoljuk a felesleges modell kapcsolatokat
				$this->Bizonylat->Tetel->unbindModel(array('belongsTo' => array('Bizonylat')));
				$this->Bizonylat->Naplo->unbindModel(array('belongsTo' => array('Naplotipus'), 'hasMany' => array('Bizonylat')));
				$this->Bizonylat->Osztaly->unbindModel(array('hasMany' => array('Bizonylat'), 'hasAndBelongsToMany' => array('Gyujto')));
				$this->Bizonylat->User->unbindModel(array('hasMany' => array('Bizonylat')));
				$bizonylat = $this->Bizonylat->find('first',
										  array(
											'conditions' => array(
																	'Bizonylat.naplo_id' => $naploid,
																	'Bizonylat.sorszam' => $sorszam,
																	'Bizonylat.osztaly_id' => $oIds
																),
											'recursive' => 2	//2 szükséges a tartozik követel adatokhoz
											));
				if($bizonylat){
					if($this->RequestHandler->isAjax()){//ajax hivas volt
						$osszegBizonylatig = !$osszegBizonylatig;
						$this->Session->write('Bizonylat.osszegBizonylatig', $osszegBizonylatig);

						//ha devizás naplóról van szó
						$valutaId = $bizonylat['Naplo']['Valuta']['id'];
						$syama = $this->Setting->getRow('syama_valuta_id');
						$jegy = $this->Setting->getRow('jegy_valuta_id');
						if(Configure::read('Config.valuta.id') != $valutaId && $valutaId != $syama['Setting']['value'] && $valutaId != $jegy['Setting']['value']){
							$zEgyenleg = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($naploid, $this->Session->read('Settings.ev'), $osszegBizonylatig ? $bizonylat['Bizonylat']['id'] : null);
							$zEgyenleg = number_format($zEgyenleg['tegyenleg']-$zEgyenleg['kegyenleg'], 2, ',', '.');
						} else {
							$zEgyenleg = $this->Bizonylat->Tetel->getEgyenleg($naploid, $this->Session->read('Settings.ev'), $osszegBizonylatig ? $bizonylat['Bizonylat']['id'] : null);
							$zEgyenleg = number_format($zEgyenleg['tegyenleg']-$zEgyenleg['kegyenleg'], 0, ',', '.');
						}
						$this->set('bizonylat', array(
														'sikeres' => true,
														'zEgyenleg' => $zEgyenleg,
														'bizonylatig' => $osszegBizonylatig,
														  )
									  );
						$this->render();
					} else {
						$this->Bizonylat->id = $bizonylat['Bizonylat']['id'];

						//mely tételek tartoznak ehhez a bizonylathoz
						$tetelidk = array();
						foreach($bizonylat['Tetel'] as $kulcs => $tetel){
							$tetelidk[] = $tetel['id'];
						}
						//válasszuk le a következő lekéréshez az itt nem használt kötéseket
						$this->Bizonylat->Tetel->unbindModel(array('belongsTo' => array('Bizonylat', 'TartozikSzamla', 'KovetelSzamla')));
						//milyen gyujtők vannak az egyes tételekhez csatolva
						$gyujtok = $this->Bizonylat->Tetel->find(
									'all',
									array(
										'conditions'	=> array('Tetel.id' => $tetelidk),
										'fields'			=> 'id'));
						$this->set('gyujtok', $gyujtok);
						foreach($gyujtok as $i => $gy){
							$bizonylat['Tetel'][$i]['gyujtok'] = $gy['Gyujto'];
						}

						$bizonylatOsszeg = $this->Bizonylat->Tetel->find('first',
																array(
																	'conditions' => array(
																							'bizonylat_id' => $bizonylat['Bizonylat']['id'],
																							'spec !=' => 'd'
																							),
																	'fields' => 'SUM(osszeg)',
																	'recursive' => -1
																	)
																);
						$bizonylat['Bizonylat']['osszeg'] = $bizonylatOsszeg[0]['SUM(osszeg)'];

						$this->set('alapertelmezettOsztaly', $this->Bizonylat->Naplo->getOsztalyId($naploid));
						$this->set('szamla', $this->Bizonylat->Tetel->TartozikSzamla->getRow($this->Bizonylat->Naplo->getSzamla($bizonylat['Naplo']['alapertelmezett_szamla'])));
						$this->set('naplotipus', $this->Bizonylat->Naplo->Naplotipus->getRow($bizonylat['Naplo']['naplotipus_id']));

						//a napló egyenlegének lekérdezése (amennyiben értelmezhető)
						$egyenleg = $this->Bizonylat->Tetel->getEgyenleg($bizonylat['Naplo']['id'], $this->Session->read('Settings.ev'), $osszegBizonylatig ? $bizonylat['Bizonylat']['id'] : null);
						//ha devizás naplótól van szó ki kell számítanunk a devizás egyenleget
						$valutaId = $bizonylat['Naplo']['Valuta']['id'];
						$syama = $this->Setting->getRow('syama_valuta_id');
						$jegy = $this->Setting->getRow('jegy_valuta_id');
						if(Configure::read('Config.valuta.id') != $valutaId && $valutaId != $syama['Setting']['value'] && $valutaId != $jegy['Setting']['value']){
							$arfolyam = $this->Arfolyam->getArfolyam($bizonylat['Naplo']['Valuta']['nev']);
							$arfolyam = $arfolyam[$bizonylat['Naplo']['Valuta']['id']]['arfolyam'];

							$valutaEgyenleg = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($bizonylat['Naplo']['id'], $this->Session->read('Settings.ev'), $osszegBizonylatig ? $bizonylat['Bizonylat']['id'] : null);
							$this->set('valutaegyenleg', $valutaEgyenleg);
							$this->set('valuta', $this->Bizonylat->Naplo->Valuta->getRow($bizonylat['Naplo']['valuta_id']));
						}
	//debug($bizonylat);
						$this->set('egyenleg', $egyenleg);

						$this->set('bizonylat', $bizonylat);
						$this->set('naplo', $this->Bizonylat->Naplo->getRow($bizonylat['Naplo']['id']));
						//kérjük le az előző és a következő bizonylatok id-jét a lapozáshoz
						$lapozo = $this->Bizonylat->find(
								'neighbors',
								array(
									'field' => 'sorszam',
									'value' => $bizonylat['Bizonylat']['sorszam'],
									'conditions' => array(
															'naplo_id' => $naploid,
															'osztaly_id' => $oIds
															),
									'fields' => array('id', 'sorszam', 'megjegyzes', 'datum'),
									'recursive' => -1
									));
						$lapozo['utolso']['Bizonylat'] = $this->Bizonylat->getLastFromNaplo($naploid);
						$this->set('lapozo', $lapozo);
					}
				}
				else{
					//nincs ilyen sorszámú bizonylat
					$this->redirect(array('action' => 'uj/'.$naploid));
				}
			}
		}
	}

/**
 * Új bizonylat rögzítése
 * @param int $naploId a használt napló azonosítója
 * @return nothing
 */
	function uj($naploId = null){
		//ha $naploId nélkül van meghívva akkor ki kell dobni a usert
		$this->set('paginator', $p=$this->paginate('Bizonylat'));
		//a user hozzáfér-e a napló osztályához?
		$oId = $this->Bizonylat->Naplo->getOsztalyId($naploId);
		$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		if($oId && !in_array($oId, $oIds)){
			$this->Session->setFlash('A kiválasztott naplóhoz nincs jogosultságod!');
			$this->redirect(array('action' =>'index'));
		}
		
		if($naploId){
			//meg kell nézni, hogy létezõ $naploId-t adtunk-e meg
			if($_naplo = $this->Bizonylat->Naplo->isValidId($naploId)){

				if($_naplo['Naplo']['lezart']){		//a napló már le van zárva. Tiltjuk az új bizonylatok létrehozását
					$_sorszam = $this->Bizonylat->find('first',
															 array(
																	 'fields' => 'sorszam',
																	 'order' => 'sorszam DESC',
																	 'recursive' => -1,
																	 'conditions' => array('Bizonylat.naplo_id' => $naploId)));
					$this->redirect(array('action' =>'modosit', $_naplo['Naplo']['id'], $_sorszam['Bizonylat']['sorszam']));
				}

				//ha az alap valutáról van szó az árfolyam 1
				$valutaId = $this->Bizonylat->Naplo->getValutaId($naploId);
				$syama = $this->Setting->getRow('syama_valuta_id');
				$jegy = $this->Setting->getRow('jegy_valuta_id');
				if(Configure::read('Config.valuta.id') == $valutaId
					|| $valutaId == $syama['Setting']['value'] ||  $valutaId == $jegy['Setting']['value'])
					$arfolyam = 1;
				else{
					//átlag árfolyam számítása vagy kinyerése összesítõ AB táblából
					$valuta = $this->Arfolyam->getArfolyam();
					//debug($valuta);
					$this->set('valuta', $valuta);
				}
				if(!empty($this->request->data)){	//már van elküldött adat
					try{
						$this->request->data['ev'] = $this->Session->read('Settings.ev');
						$this->request->data['cegId'] = $this->Session->read('Settings.cegId');
						$this->request->data['userCsoport'] = $this->Session->read('Auth.User.csoport');
						$this->request->data = $this->Bizonylat->elokeszit($this->request->data);
						if($this->request->data){
							//Debugger::log($this->request->data);
							$this->Bizonylat->create();
							if($this->Bizonylat->rogzit($this->request->data, $this->Session->read('Settings'))){	//sikeres mentés
								if($this->RequestHandler->isAjax()){	//ajax hívás volt
									$naplo = $this->Bizonylat->Naplo->getRow($naploId);
	
									if(isset($valuta)){
										//a valutás naplóknál máshogyan adjuk vissza az egyenleget
										$valutaEgyenleg = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($naploId, $this->Session->read('Settings.ev'));
										$this->set('valutaegyenleg', $valutaEgyenleg);
										$zEgyenleg = number_format($valutaEgyenleg['tegyenleg']-$valutaEgyenleg['kegyenleg'], 2, ',', '.');
									}
									else{
										$zEgyenleg = $this->Bizonylat->Tetel->getEgyenleg($naploId, $this->Session->read('Settings.ev'));
										$zEgyenleg = number_format($zEgyenleg['tegyenleg']-$zEgyenleg['kegyenleg'], 2, ',', '.');
									}
									$this->set('bizonylat', array(
																	'ujSorszam' => ($this->request->data['Bizonylat']['sorszam']+1),
																	'ujzEgyenleg' => $zEgyenleg,
																	'uzenet' => 'Mentve'
																	));
									$this->render();	//rendereljük le az ajax választ a sikeres rögzítésről
								}
								else	//nem ajax adatküldés volt ki vele a bizonylat főoldalra (kikapcsolt JS)
									$this->redirect(array('action'=>'index'));
							}
							else {	//sikertelen mentés
								throw new NotImplementedException('Sikertelen mentés: Valami kezeletlen rogzitt() hibára futottam!');
								if($this->RequestHandler->isAjax()){
									$this->render();
								}
								else
									$this->Session->setFlash(__('The Bizonylat could not be saved. Please, try again.'), 'default', array('class' => 'alert'));
							}
							$this->set('lapozo', $this->Bizonylat->find(
								'neighbors',
								array(
									'field' => 'sorszam',
									'value' => $this->request->data['Bizonylat']['sorszam'],
									'conditions' => array('naplo_id' => $naploId),
									'fields' => array('id', 'sorszam', 'megjegyzes', 'datum'),
									'recursive' => -1
									))
								);
						}
						else{
							throw new NotImplementedException('Sikertelen mentés: Valami kezeletlen elokeszit() hibára futottam!');
						}
					}
					catch (Exception $e){		//sikertelen _elokeszit
						$this->set('bizonylat', array(
																'uzenet' => $e->getMessage()
																));
						$this->render();
					}
				}
				elseif(isset($valuta)){
					$valutaEgyenleg = $this->Bizonylat->Tetel->Valutatetel->getEgyenleg($naploId, $this->Session->read('Settings.ev'));
					$this->set('valutaegyenleg', $valutaEgyenleg);
				}
				//még nem volt elküldött adat, vagy az adatmentés sikertelen volt és nem ajaxxal kértük
				$alapertelmezettOsztaly = $this->Bizonylat->Naplo->getOsztalyId($naploId);
				//debug($alapertelmezettOsztaly);
				if($alapertelmezettOsztaly)
					$osztaly = $this->Bizonylat->Osztaly->find('first',
																				array(
																					'conditions' => array('Osztaly.id' => $alapertelmezettOsztaly),
																					'recursive' => -1
																					));
				else
					$osztalyok = $this->Bizonylat->Osztaly->find('list');

				$naplo = $this->Bizonylat->Naplo->getRow($naploId);
				$szamlaszam = $this->Bizonylat->Tetel->TartozikSzamla->getRow($naplo['Naplo']['alapertelmezett_szamla']);

				$sorszam = $this->Bizonylat->find('first',
															 array(
																	 'fields' => 'sorszam',
																	 'order' => 'sorszam DESC',
																	 'recursive' => -1,
																	 'conditions' => array('Bizonylat.naplo_id' => $naploId)));

				$this->set('lapozo', $this->Bizonylat->find(
					'neighbors',
					array(
						'field' => 'sorszam',
						'value' => ($sorszam['Bizonylat']['sorszam']+1),	//+1 mert az új sorszáma egyel nagyobb lesz mint a jelenlegi utolsó
						'conditions' => array('naplo_id' => $naploId),
						'fields' => array('id', 'sorszam', 'megjegyzes', 'datum'),
						'recursive' => -1
						))
					);

				//a napló egyenlegének lekérdezése (amennyiben értelmezhető)
				$egyenleg = $this->Bizonylat->Tetel->getEgyenleg($naploId, $this->Session->read('Settings.ev'));
				//ha devizás naplótól van szó ki kell számítanunk a devizás egyenleget
				/*if($arfolyam != 1){
					debug($naplo['Valuta'][id]);
				}*/

				//napló fejléc
				$alapInfo = $this->Bizonylat->query('SELECT szamlak.szam, naplok.id, naplok.nev, naplotipusok.nev, valutak.nev, naplotipusok.kod, naplok.sorszam
													FROM naplok, naplotipusok, valutak, szamlak
													WHERE naplok.id = '.$naploId.'
													AND naplok.naplotipus_id = naplotipusok.id
													AND naplok.valuta_id = valutak.id
													AND naplok.alapertelmezett_szamla = szamlak.id');
				$this->set('alapInfo', $alapInfo[0]);
				$this->set(compact('naplo', 'alapertelmezettOsztaly', 'osztaly', 'osztalyok', 'arfolyam', 'sorszam', 'szamlaszam', 'egyenleg'));
			}
			else
				$this->redirect(array('action' =>'index'));	//nem valós a naploId ki vele a bizonylat főoldalra
		}
		else	//nem adott meg naploId-t kidobjuk a bizonylat főoldalra
			$this->redirect(array('action' =>'index'));
	}

/*
 * A lekérdezések során azokat a tételeket keressük amelyek megfelelnek a $this->request->data
 * tömbben érkező szűrési feltételeknek
 * $this->request->data lehetséges kulcsai:
 * 	osztalytol: mely osztálykódtól kezdődik a megjelenés
 * 	osztalyig: mely osztalykódig tart
 *
 * named parameters - passedArgs:
 * 	id: mentett lekérdezés id-je
 * 	did: törlendő mentett lekérdezés id-je
 * 	osztalyId: osztály id
 * 	szamlaSzam: a keresett számla száma
 *
 * a metódus akkor hívódik paraméterekkel ha egy lekérdezési lista egyik sorában rákattinttunk egy ellenszámlára
 * @param int $osztalId ilyen osztály id-jű tételeket keresünk
 * @param int $szamlaSzam ilyen szamla id-jű tételeket keresünk
*/
	function lekerdezes() {
		//debug($this->request->data);
		/*		Array(
				[Bizonylat] => Array
			    (
					[osztalytol] => 38
					[osztalyig] =>
					[szamlatol] => 911952
					[szamlaig] => 911952
					[_osztalytol] => 92 Faellátás
					[_osztalyig] =>
					[_szamlatol] => 911952 Vízdíjak
					[_szamlaig] =>
					[datumtol] => 2009-01-01
					[datumig] => 2010-07-03
					[szoveg] =>
					[osszeg] =>
					[valutaCsak] =>
					[valutaNem] =>
					[kivonat] => teteles
					[valutas] => 0
					[excel] => 0
					[mentes] => 0
					[lekerdezes] =>
	        )
		    [Tetel] => Array(
            [gyujto] => 7
				)
		    [_Tetel] => Array(
            [gyujto] => 7037 Gopicandra d
        ))*/

		if(isset($this->passedArgs['id'])) {
			$t = $this->Lekerdezes->find(
				'first',
				array(
					'fields' => 'Lekerdezes.parameterek',
					'conditions' => array(
											'Lekerdezes.id' => $this->passedArgs['id'],
											'Lekerdezes.user_id' => $this->Session->read('Auth.User.id')
											)
				)
			);
			$this->request->data = unserialize($t['Lekerdezes']['parameterek']);
			//nem futtatjuk le a lekérdezést csak feltöltjük adatokkal a formot
			//debug($this->request->data);
			$this->set('lekerdezesAdat', $this->request->data);
			$this->render();
		}
		if(isset($this->passedArgs['did'])) {
			$this->Lekerdezes->deleteAll(array('Lekerdezes.id' => $this->passedArgs['did'], 'Lekerdezes.user_id' => $this->Session->read('Auth.User.id')), false);
		}

		$lekerdezesek = $this->Lekerdezes->find(
			'all',
			array(
				'fields' => array('Lekerdezes.id', 'Lekerdezes.lekerdezes'),
				'conditions' => array('Lekerdezes.user_id' => $this->Session->read('Auth.User.id'))
			)
		);
		$this->set('lekerdezesek', $lekerdezesek);

		set_time_limit(800);	//kivonat jelenlegi paraj megoldása miatt kell illetve a lapozás hiánya miatt

		//named parameter kezelés
		//ha linkről hívtuk át a paramétereket be kell tenni a $this->request->data tömbbe
		if(isset($this->passedArgs['szamlaSzam'])){
			$this->request->data['Bizonylat']['szamlatol'] = urldecode($this->passedArgs['szamlaSzam']);
		}
		if($this->passedArgs){
			$this->request->data['Bizonylat'] = array_map('urldecode', $this->passedArgs);
		}
		if(isset($this->passedArgs['tetelGyujto'])){
			$this->request->data['Tetel']['gyujto'] = urldecode($this->passedArgs['tetelGyujto']);
		}

		if(isset($datumtol))
			$this->request->data['Bizonylat']['datumtol'] = $datumtol;
		if(isset($datumig))
			$this->request->data['Bizonylat']['datumig'] = $datumig;

		//elérhető valuták listája
		$this->set('valutak', $this->Bizonylat->Naplo->Valuta->find('list',
																  array(
																		'fields' => array('Valuta.nev'),
																		'order' => 'Valuta.nev',
																		'recursive' => -1
																		)
																  )
				);

		if($this->request->data){	//van már elküldött adat
			// ha menteni kell a lekerdezest es van megadva 'lekerdezes'
			if(isset($this->request->data['Bizonylat']['mentes']) && $this->request->data['Bizonylat']['mentes'] == 1 && strlen(trim($this->request->data['Bizonylat']['lekerdezes'])) > 0) {
				$t = $this->request->data;
				unset($t['Bizonylat']['datumtol']);
				unset($t['Bizonylat']['datumig']);
				unset($t['Bizonylat']['mentes']);
				$tt = array(
					'Lekerdezes' => array(
						'user_id' => $this->Session->read('Auth.User.id'),
						'lekerdezes' => $this->request->data['Bizonylat']['lekerdezes'],
						'parameterek' => serialize($t),
					),
				);
				$this->Lekerdezes->create();
				if($this->Lekerdezes->save($tt)) {
					$this->Session->setFlash(__('Lekerdezés mentve.'));
				} else {
					$this->Session->setFlash(__('Lekerdezés nincs mentve.'), 'default', array('class' => 'alert'));
				}
			}

			//debug($this->request->data);die();
			//easyDate helper betöltése
			App::uses('EasyDate', 'Utility');
			$easyDate = new EasyDate();
			$easyDate->onErrorReturnCurrentDate = true;

			//1. milyen dátumokra vagyunk kíváncsiak?
			$datumtol = isset($this->request->data['Bizonylat']['datumtol']) ? $easyDate->change($this->request->data['Bizonylat']['datumtol']) : $this->Session->read('Settings.ev') . '-01-01';
			$datumig = isset($this->request->data['Bizonylat']['datumig']) ? $easyDate->change($this->request->data['Bizonylat']['datumig']) : date('Y-m-d');
			//$feltetelek .= "\n" . 'AND bizonylatok.datum BETWEEN "'.$datumtol.'" AND "'.$datumig.'" ';
			$feltetel['datum'] =  "\n" . 'AND bizonylatok.datum BETWEEN "'.$datumtol.'" AND "'.$datumig.'" ';

			//2. melyik osztályokra vagyunk kíváncsiak?
			if(!$this->request->data['Bizonylat']['osztalytol'] && $this->request->data['Bizonylat']['_osztalytol']){
				//a user nem várta meg az ajax lekérést
				//a _osztalytól tartalmazza az OsztályKódot
				$this->request->data['Bizonylat']['osztalytol'] = $this->Bizonylat->Osztaly->getOsztalyId($this->request->data['Bizonylat']['_osztalytol'], array('ev' => $this->Session->read('Settings.ev'), 'cegId' => $this->Session->read('Settings.cegId')));
			}
			if(!$this->request->data['Bizonylat']['osztalyig'] && $this->request->data['Bizonylat']['_osztalyig']){
				//a user nem várta meg az ajax lekérést
				//a _osztalytól tartalmazza az OsztályKódot
				$this->request->data['Bizonylat']['osztalyig'] = $this->Bizonylat->Osztaly->getOsztalyId($this->request->data['Bizonylat']['_osztalyig'], array('ev' => $this->Session->read('Settings.ev'), 'cegId' => $this->Session->read('Settings.cegId')));
			}
			if($this->request->data['Bizonylat']['osztalytol'] && $this->request->data['Bizonylat']['osztalyig'] && $this->request->data['Bizonylat']['osztalytol'] != $this->request->data['Bizonylat']['osztalyig']){
				//több osztályos lekérdezés
				if($this->request->data['Bizonylat']['osztalytol'] < $this->request->data['Bizonylat']['osztalyig']){
					$osztalytol = $this->request->data['Bizonylat']['osztalytol'];
					$osztalyig = $this->request->data['Bizonylat']['osztalyig'];
				}
				else{
					$osztalytol = $this->request->data['Bizonylat']['osztalyig'];
					$osztalyig = $this->request->data['Bizonylat']['osztalytol'];
				}
				//keressük meg az id-khez tartozó kódokat
				$oszt = $this->Bizonylat->Osztaly->find(
					'all',
					array(
						'fields' => 'id, kod',
						'conditions' => array(
												 'Osztaly.id'  => array(
														$osztalytol,
														$osztalyig
													 ),
												 'Osztaly.ev' => $this->Session->read('Settings.ev')
													),
						'order' => 'Osztaly.kod',
						'recursive' => -1
						)
				);
				//debug($oszt);
				$this->Bizonylat->Osztaly->unbindModel(
															array(
																'hasMany' => array('Bizonylat')
																)
															);

				//todo itt ki kéne szűrni, hoigy ne kérdezzük le a nem ehhez a céghez tartozó osztályokat
				$oszt = $this->Bizonylat->Osztaly->find(
					'all',
					array(
						'fields' => 'id, nev',
						'conditions' => array(
												 'Osztaly.kod BETWEEN ? AND ?' => array(
														$oszt[0]['Osztaly']['kod'],
														$oszt[1]['Osztaly']['kod']
													 ),
												 'Osztaly.ev' => $this->Session->read('Settings.ev')
													),
						'order' => 'Osztaly.kod'
						//'recursive' => -1
						)
				);
				//debug($oszt);
				foreach($oszt as $o){
					if($o['Gyujto'][0]['id'] == $this->Session->read('Settings.cegId')){
						$osztalyIdk[] = $o['Osztaly']['id'];
						$osztalyok[$o['Osztaly']['id']] = $o['Osztaly']['nev'];
					}
				}
			}
			elseif($this->request->data['Bizonylat']['osztalytol']){		//egy osztályra vonatkozik  a lekérdezés
				$oszt = $this->Bizonylat->Osztaly->find(
					'first',
					array(
						'fields' => array('id', 'nev'),
						'conditions' => array('Osztaly.id' => $this->request->data['Bizonylat']['osztalytol']),
						'order' => 'Osztaly.kod',
						'recursive' => -1
						)
					);
				//debug($oszt);
				$osztalyIdk = array($oszt['Osztaly']['id']);
				//debug($osztalyIdk);
				$osztalyok[$oszt['Osztaly']['id']] = $oszt['Osztaly']['nev'];
			}
			if(isset($osztalyok)){
				/*$feltetelek .= "\n" . 'AND osztalyok.id IN ('.implode(', ', $osztalyIdk).')';*/
				$feltetel['osztaly'] =  "\n" . 'AND osztalyok.id IN ('.implode(', ', $osztalyIdk).')';
			}
			else{
				//nincs osztály kiválasztva
				$osztalyok = array(0 => 'NA');	//todo: hardcoded //a lekérdezés megjelenítés miatt szükséges, hogy a tömb 0-ik eleme létezzen
				$feltetel['osztaly'] = null;
			}
			//és végül szűkítsük le azokra az osztályokra amelyhez ténylegesen hozzáférése van
			$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
			$feltetel['osztaly'] .=  "\n" . 'AND osztalyok.id IN ('.implode(', ', $oIds).')';
			//debug($osztalyok);

			//3. melyik számlákra vagyunk kíváncsiak
			//debug($this->request->data['Bizonylat']);
			if(!$this->request->data['Bizonylat']['szamlatol'] && $this->request->data['Bizonylat']['_szamlatol']){
				//a user nem várta meg az ajax lekérést
				$spacePos = strpos($this->request->data['Bizonylat']['_szamlatol'], ' ');
				$spacePos = $spacePos ? $spacePos : strlen($this->request->data['Bizonylat']['_szamlatol']);
				$this->request->data['Bizonylat']['szamlatol'] = substr($this->request->data['Bizonylat']['_szamlatol'], 0, $spacePos);
			}
			if(!$this->request->data['Bizonylat']['szamlaig'] && $this->request->data['Bizonylat']['_szamlaig']){
				//a user nem várta meg az ajax lekérést
				$spacePos = strpos($this->request->data['Bizonylat']['_szamlaig'], ' ');
				$spacePos = $spacePos ? $spacePos : strlen($this->request->data['Bizonylat']['_szamlaig']);
				$this->request->data['Bizonylat']['szamlaig'] = substr($this->request->data['Bizonylat']['_szamlaig'], 0, $spacePos);
			}
			//ha számlatartományunk is van akkor a beszámoló táblából jöttünk
			if(isset($this->passedArgs['szamlaTartomany'])){
				App::uses('SzamlaSzamSQL', 'Utility');
				$szamlaSzamSQL = new SzamlaSzamSQL();
				$szamlaTartomany = $szamlaSzamSQL->createSzamlaTartomanySql($this->passedArgs['szamlaTartomany']);
				//debug($szamlaTartomany);		//(szamlak.szam BETWEEN "527" AND "5279999999999") AND (szamlak.szam NOT BETWEEN "5271" AND "52719999999999")
				$feltetel['szamlak'] = ' AND (' . str_replace('szamlak', 'tartozikSzamlak', $szamlaTartomany) . '
						OR ' . str_replace('szamlak', 'kovetelSzamlak', $szamlaTartomany) . ')';

				preg_match('/\d+/', $szamlaTartomany, $sz);
				//debug($sz);
				$this->request->data['Bizonylat']['szamlatol'] = $sz[0];
				$this->request->data['Bizonylat']['szamlaig'] = $sz[0] . '9999999999';
			}
			elseif(!$this->request->data['Bizonylat']['szamlatol'] && !$this->request->data['Bizonylat']['szamlaig']){
				//se tól se ig lekérünk mindent
				$this->request->data['Bizonylat']['szamlatol'] = 1;
				$this->request->data['Bizonylat']['szamlaig'] = 9999999999;
			}
			else{
				if(!$this->request->data['Bizonylat']['szamlaig']){
					$this->request->data['Bizonylat']['szamlaig'] = $this->request->data['Bizonylat']['szamlatol'];
				}
				else{
					$sz = array($this->request->data['Bizonylat']['szamlatol'], $this->request->data['Bizonylat']['szamlaig']);
					sort($sz, SORT_STRING);
					$this->request->data['Bizonylat']['szamlatol'] = $sz[0];
					$this->request->data['Bizonylat']['szamlaig'] = $sz[1];
				}
			}

			$feltetel['tartozikSzamlak'] = 'tartozikSzamlak.szam BETWEEN "'.$this->request->data['Bizonylat']['szamlatol'].'" AND "'.$this->request->data['Bizonylat']['szamlaig'].'"';
			$feltetel['kovetelSzamlak'] = 'kovetelSzamlak.szam BETWEEN "'.$this->request->data['Bizonylat']['szamlatol'].'" AND "'.$this->request->data['Bizonylat']['szamlaig'].'"';
			//$feltetel['szamlak'] = 'AND (' . $feltetel['tartozikSzamlak'] . ' OR ' . $feltetel['kovetelSzamlak'] . ')';
			if(!isset($feltetel['szamlak']))
				/*$feltetel['szamlak'] = 'AND ((' . $feltetel['tartozikSzamlak'] . ' OR ' . $feltetel['kovetelSzamlak'] . ') ' . $feltetel['masSzamlak'] . ')';
			else*/
				$feltetel['szamlak'] = 'AND (' . $feltetel['tartozikSzamlak'] . ' OR ' . $feltetel['kovetelSzamlak'] . ')';

			//4. gyüjtő szűrésünk van?
			if($this->request->data['_Tetel']['gyujto'] == '!'){
				//olyan tételeket keresünk amin nincs gyüjtő
				$join['gyujto'] = 'LEFT JOIN gyujtok_tetelek ON gyujtok_tetelek.tetel_id = tetelek.id';
				$feltetel['gyujto'] = 'AND gyujtok_tetelek.gyujto_id IS NULL';
			}
			else{
				if(!$this->request->data['Tetel']['gyujto'] && $this->request->data['_Tetel']['gyujto']){
					//a user nem várta ki az ajax lekérést
					$this->request->data['Tetel']['gyujto'] = $this->Bizonylat->Tetel->Gyujto->getIdByNev($this->request->data['_Tetel']['gyujto']);
				}
				if($this->request->data['Tetel']['gyujto']){
					$mezok['gyujto'] = ', gyujtok_tetelek.gyujto_id';	//kell a vessző az elejére
					$join['gyujto'] = 'LEFT JOIN gyujtok_tetelek ON (gyujtok_tetelek.tetel_id = tetelek.id AND gyujtok_tetelek.gyujto_id = '.$this->request->data['Tetel']['gyujto'].')';
					$feltetel['gyujto'] = 'AND gyujtok_tetelek.gyujto_id IS NOT NULL';
					$gyujto = 'RIGHT JOIN
										gyujtok_tetelek
									ON gyujtok_tetelek.tetel_id = tetel.tetelId
									WHERE gyujtok_tetelek.gyujto_id = ' . $this->request->data['Tetel']['gyujto'];
				}
				else{
					$gyujto = '';
					$mezok['gyujto'] = $join['gyujto'] = $feltetel['gyujto'] = '';
				}
			}
			//debug($gyujto);

			//5. tételes vagy kivonat adatokat kérdezünk le?
			if(!$this->request->data['Bizonylat']['kivonat'])
				$this->request->data['Bizonylat']['kivonat'] = 'teteles';
			$this->set('kivonat', $this->request->data['Bizonylat']['kivonat']);

			//6. Forintban vagy valutában kérjük le az adatokat?
			$sql_forintTetelek = '(SELECT tetelek.id AS tetelId, tetelek.szoveg AS tetelSzoveg, tetelek.osszeg,
											tetelek.spec AS tetelSpec, tetelek.bizonylat_id AS bizonylatId,
											tetelek.t, tetelek.k
									FROM tetelek) AS tetelek';

			$sql_valutaTetelek = '(SELECT tetel_id AS vtId, valuta_id AS valutaId, osszeg AS valutaOsszeg, arfolyam
											FROM valutatetelek) AS valutaT';

			$sql_tetelek = $this->request->data['Bizonylat']['valutas'] ? ($sql_valutaTetelek . ' LEFT JOIN ' . $sql_forintTetelek . ' ON valutaT.vtId = tetelek.tetelId')
																				: $sql_forintTetelek;

			if(isset($this->request->data['Bizonylat']['valutas'])){
				$mezok['valuta'] = ', valutatetelek.valuta_id AS valutaId,
											valutatetelek.osszeg AS valutaOsszeg, valutatetelek.arfolyam';
				$join['valuta'] = 'LEFT OUTER JOIN valutatetelek ON valutatetelek.tetel_id = tetelek.id';
			}
			else{
				$mezok['valuta'] = $join['valuta'] = '';
			}
			$this->set('valutas', $valutas = $this->request->data['Bizonylat']['valutas'] ? $this->request->data['Bizonylat']['valutas'] : null);

			//7. szövegre szűrés
			$feltetel['szoveg'] = '';
			if($szoveg = $this->request->data['Bizonylat']['szoveg'] ? $this->request->data['Bizonylat']['szoveg'] : null){
				$feltetel['szoveg'] = 'AND (bizonylatok.megjegyzes LIKE "%'.$szoveg.'%" OR tetelek.szoveg LIKE "%'.$szoveg.'%")';
			}

			//8. valutára szűrés
			$feltetel['valutaCsak'] = '';
			if($valutaCsak = $this->request->data['Bizonylat']['valutaCsak'] ? $this->request->data['Bizonylat']['valutaCsak'] : null){
				$feltetel['valutaCsak'] = 'AND naplok.valuta_id = ' . $valutaCsak;
			}
			$feltetel['valutaNem'] = '';
			if($valutaNem = $this->request->data['Bizonylat']['valutaNem'] ? $this->request->data['Bizonylat']['valutaNem']  : null){
				$feltetel['valutaNem'] = 'AND naplok.valuta_id != ' . $valutaNem;
			}

			//9. összegre szűrés
			$feltetel['osszeg'] = '';
			if($osszeg = $this->request->data['Bizonylat']['osszeg'] ? str_replace(' ', '', $this->request->data['Bizonylat']['osszeg']) : null){
				$feltetel['osszeg'] = 'AND tetelek.osszeg = ' . $osszeg;
			}

			//a lekérdezés futtatása
			//debug($feltetel);
			$sql = 'SELECT osztalyok.id AS osztalyId, osztalyok.nev AS osztaly,
								naplotipusok.kod AS naploTipusKod,
								naplok.id AS naploId, naplok.sorszam AS naploSorszam,
								bizonylatok.sorszam AS bizonylatSorszam, bizonylatok.datum, bizonylatok.megjegyzes AS bizonylatMegjegyzes, bizonylatok.spec AS bizonylatSpec,
								tetelek.id AS tetelId, tetelek.szoveg AS tetelSzoveg, tetelek.osszeg, tetelek.spec AS tetelSpec, tetelek.bizonylat_id AS bizonylatId, tetelek.t, tetelek.k,
								tartozikSzamlak.id AS tSzamlaId, tartozikSzamlak.szam AS tSzamlaSzam, tartozikSzamlak.nev AS tSzamla,
								kovetelSzamlak.id AS kSzamlaId, kovetelSzamlak.szam AS kSzamlaSzam, kovetelSzamlak.nev AS kSzamla,
								valutak.nev AS valutaNev 
								'.$mezok['gyujto'].'
								'.$mezok['valuta'].'
							FROM osztalyok, naplotipusok, naplok, valutak, bizonylatok, tetelek
							LEFT JOIN szamlak AS tartozikSzamlak ON (tartozikSzamlak.id = tetelek.t)
							LEFT JOIN szamlak AS kovetelSzamlak ON (kovetelSzamlak.id = tetelek.k)
							'.$join['gyujto'].'
							'.$join['valuta'].'
							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND naplok.naplotipus_id = naplotipusok.id
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							ANd naplok.valuta_id = valutak.id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							AND bizonylatok.id = tetelek.bizonylat_id
							'.$feltetel['datum'].'
							'.$feltetel['osztaly'].'
							'.$feltetel['szamlak'].'
							'.$feltetel['gyujto'].'
							'.$feltetel['szoveg'].'
							'.$feltetel['valutaCsak'].'
							'.$feltetel['valutaNem'].'
							'.$feltetel['osszeg'].'
							ORDER BY datum, bizonylatSorszam, tetelId';
			//debug($sql);die();
			if($this->request->data['Bizonylat']['kivonat'] == 'kivonat'){
				//mivel a mysql nem ismeri a full outer joint ezért egy left join és egy right join unionjával helyettesítjük
				$sql = 'SELECT IFNULL(osztalyId, oId) AS osztalyId, IFNULL(osztaly, o) AS osztaly,
									IFNULL(tSzamlaId, kSzamlaId) AS szamlaId, IFNULL(tSzamlaSzam, kSzamlaSzam) AS szamlaSzam, IFNULL(tSzamla, kSzamla) AS szamla,
									tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
								FROM
								(SELECT kivonat.osztalyId, kivonat.osztaly,
											kivonat.tSzamlaId, kivonat.tSzamlaSzam, kivonat.tSzamla,
											SUM(kivonat.osszeg) AS tForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS tValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.osztalyId, kivonat.tSzamlaId) AS t1

							LEFT JOIN

								(SELECT kivonat.osztalyId AS oId, kivonat.osztaly AS o,
											kivonat.kSzamlaId, kivonat.kSzamlaSzam, kSzamla,
											SUM(kivonat.osszeg) AS kForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS kValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.osztalyId, kivonat.kSzamlaId) AS t2

							ON (t1.osztalyId = t2.oId AND t1.tSzamlaId = t2.kSzamlaId)

							UNION ALL

							SELECT IFNULL(osztalyId, oId) AS osztalyId, IFNULL(osztaly, o) AS osztaly,
										IFNULL(tSzamlaId, kSzamlaId) AS szamlaId, IFNULL(tSzamlaSzam, kSzamlaSzam) AS szamlaSzam, IFNULL(tSzamla, kSzamla) AS szamla,
										tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
								FROM
								(SELECT kivonat.osztalyId, kivonat.osztaly,
											kivonat.tSzamlaId, kivonat.tSzamlaSzam, kivonat.tSzamla,
											SUM(kivonat.osszeg) AS tForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS tValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.osztalyId, kivonat.t) AS t3

							RIGHT JOIN

								(SELECT kivonat.osztalyId AS oId, kivonat.osztaly AS o,
											kivonat.kSzamlaId, kivonat.kSzamlaSzam, kSzamla,
											SUM(kivonat.osszeg) AS kForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS kValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.osztalyId, kivonat.k) AS t4

							ON (t3.osztalyId = t4.oId AND t3.tSzamlaId = t4.kSzamlaId)

							WHERE t3.osztalyId IS NULL AND t3.tSzamlaId IS NULL

							ORDER BY osztalyId, szamlaSzam';
			}
			elseif($this->request->data['Bizonylat']['kivonat'] == 'teljeskivonat'){
				$sql = $this->_createSQL4Teljeskivonat($valutas, $join, $feltetel);
						/*
						[0] => Array(
                    [osztalyId] => 2
                    [osztalyKod] => 11
                    [osztalyNev] => Farm Központ
                    [tForgalom] => 509027.00
                    [kForgalom] => 509027.00)
						*/
			}
			elseif($this->request->data['Bizonylat']['kivonat'] == 'fokonyvi'){
				$sql = 'SELECT IFNULL(tSzamlaId, kSzamlaId) AS szamlaId, IFNULL(tSzamlaSzam, kSzamlaSzam) AS szamlaSzam, IFNULL(tSzamla, kSzamla) AS szamla,
									tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
								FROM
								(SELECT kivonat.tSzamlaId, kivonat.tSzamlaSzam, kivonat.tSzamla,
											SUM(kivonat.osszeg) AS tForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS tValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.tSzamlaId) AS t1

							LEFT JOIN

								(SELECT kivonat.kSzamlaId, kivonat.kSzamlaSzam, kSzamla,
											SUM(kivonat.osszeg) AS kForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS kValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.kSzamlaId) AS t2

							ON (t1.tSzamlaId = t2.kSzamlaId)

							UNION ALL

							SELECT IFNULL(tSzamlaId, kSzamlaId) AS szamlaId, IFNULL(tSzamlaSzam, kSzamlaSzam) AS szamlaSzam, IFNULL(tSzamla, kSzamla) AS szamla,
										tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
								FROM
								(SELECT kivonat.tSzamlaId, kivonat.tSzamlaSzam, kivonat.tSzamla,
											SUM(kivonat.osszeg) AS tForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS tValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.t) AS t3

							RIGHT JOIN

								(SELECT kivonat.kSzamlaId, kivonat.kSzamlaSzam, kSzamla,
											SUM(kivonat.osszeg) AS kForgalom' . ($valutas?', SUM(kivonat.valutaOsszeg) AS kValutaForgalom':'').'
									FROM(' . $sql . ') AS kivonat
										GROUP BY kivonat.k) AS t4

							ON (t3.tSzamlaId = t4.kSzamlaId)

							WHERE t3.tSzamlaId IS NULL

							ORDER BY szamlaSzam';
			}
			//debug($sql);die();

			$lekerdezett = $this->Bizonylat->query($sql);
			//debug($lekerdezett);
			$conditions[] = array('TartozikSzamla.szam BETWEEN ? AND ?' => array(
																			$this->request->data['Bizonylat']['szamlatol'],
																			$this->request->data['Bizonylat']['szamlaig']
																			));
			if(isset($masSzamlak)){
				foreach($masSzamlak as $m){
					$conditions[] = array('TartozikSzamla.szam BETWEEN ? AND ?' => array($m[0],$m[1]));
				}
			}
			//debug($conditions);
			$sz = $this->Bizonylat->Tetel->TartozikSzamla->find(
																'all',
																array(
																	'conditions' => array(
																				'OR' => $conditions,
																				'TartozikSzamla.ceg_id' => array(0, $this->Session->read('Settings.cegId')),
																				'TartozikSzamla.ev' => array(0, $this->Session->read('Settings.ev'))
																							),
																	'recursive' => -1
																	)
																);
			//debug($sz);

			$tmpLekerdezett = array();

			if($this->request->data['Bizonylat']['kivonat'] == 'teteles'){
				//visszalakaítjuk az sql szerinti eredményt a régi formára, hogy egyszerűbben megoldjuk a módosítást
				//todo: ennek megfelelően át lehetne alakítani a továbbiakat itt és a view-t
				foreach($lekerdezett as $l){
					if(!isset($l['valutatetelek'])){
						$l['valutatetelek'] = array('valutaId' => 0,
															'valutaOsszeg' => 0,
															'arfolyam' => 0);
					}
					$tmpLekerdezett[] = array('tetel' => array(
																	'osztalyId' => $l['osztalyok']['osztalyId'],
																	'osztaly' => $l['osztalyok']['osztaly'],
																	'naploTipusKod' => $l['naplotipusok']['naploTipusKod'],
																	'naploId' => $l['naplok']['naploId'],
																	'naploSorszam' => $l['naplok']['naploSorszam'],
																	'bizonylatSorszam' => $l['bizonylatok']['bizonylatSorszam'],
																	'datum' => $l['bizonylatok']['datum'],
																	'bizonylatMegjegyzes' => $l['bizonylatok']['bizonylatMegjegyzes'],
																	'bizonylatSpec' => $l['bizonylatok']['bizonylatSpec'],
																	'tetelId' => $l['tetelek']['tetelId'],
																	'tetelSzoveg' => $l['tetelek']['tetelSzoveg'],
																	'osszeg' => $l['tetelek']['osszeg'],
																	'tetelSpec' => $l['tetelek']['tetelSpec'],
																	'bizonylatId' => $l['tetelek']['bizonylatId'],
																	't' => $l['tetelek']['t'],
																	'k' => $l['tetelek']['k'],
																	'tSzamlaId' => $l['tartozikSzamlak']['tSzamlaId'],
																	'tSzamlaSzam' => $l['tartozikSzamlak']['tSzamlaSzam'],
																	'tSzamla' => $l['tartozikSzamlak']['tSzamla'],
																	'kSzamlaId' => $l['kovetelSzamlak']['kSzamlaId'],
																	'kSzamlaSzam' => $l['kovetelSzamlak']['kSzamlaSzam'],
																	'kSzamla' => $l['kovetelSzamlak']['kSzamla'],
																	'vtId' => $l['tetelek']['tetelId'],
																	'valutaId' => $l['valutatetelek']['valutaId'],
																	'valutaNev' => $l['valutak']['valutaNev'],
																	'valutaOsszeg' => $l['valutatetelek']['valutaOsszeg'],
																	'arfolyam' => $l['valutatetelek']['arfolyam']
																	));
				}
				$lekerdezett = $tmpLekerdezett;
				//debug($lekerdezett);
				//a lekérdezés megjelenítéséhez segítő tömbök

				//mely számlák tartoznak bele a megadott tartományba?
				$szamlak = array();
				foreach($sz as $s){
					//átalakítjuk szamlaszam => számlanév formátumra
					$szamlak[$s['TartozikSzamla']['szam']] = $s['TartozikSzamla']['nev'];
				}
				foreach($lekerdezett as $l){
					//ki kell szűrnünk azokat a számlákat amelyek nem szerepelnek a lekérdezett tömbben, azaz nem volt rajtuk mozgás
					$szamlaSzamok[$l['tetel']['tSzamlaSzam']] = $l['tetel']['tSzamlaSzam'];
					$szamlaSzamok[$l['tetel']['kSzamlaSzam']] = $l['tetel']['kSzamlaSzam'];
					//gyüjtsük ki a lekérdezett tétel id-ket
					$tetelIdk[] = $l['tetel']['tetelId'];
				}
				//debug($szamlaSzamok);
				$szamlak = array_intersect_key($szamlak, $szamlaSzamok);
				ksort($szamlak, SORT_STRING);

				//gyűjtők hozzárendelése a tételekhez
				$this->Bizonylat->Tetel->unbindModel(
																array(
																	'belongsTo' => array('Bizonylat', 'TartozikSzamla', 'KovetelSzamla')
																	)
																);

				$gyujto = $this->Bizonylat->Tetel->find(
																	'all',
																	array(
																		'fields' => 'Tetel.id',
																		'conditions' => array(
																								'Tetel.id' => $tetelIdk
																								)
																		)
																	);
				//debug($gyujto);
				$gyujtok = $gyujtoInUse = array();
				foreach($gyujto as $gy){
					$gyujtok[$gy['Tetel']['id']] = $gy['Gyujto'];
					foreach($gy['Gyujto'] as $gyiu){
						$gyujtoInUse[$gyiu['id']] = $gyiu['nev'];
					}
				}
				//debug($gyujtok);
				asort($gyujtoInUse);
				//debug($gyujtoInUse);

				$this->set('gyujtok', $gyujtok);
				$this->set('gyujtoInUse', $gyujtoInUse);
				$this->set('szamlak', $szamlak);
				$this->set('osztalyok', $osztalyok);
				//debug($osztalyok);
			}
			elseif($this->request->data['Bizonylat']['kivonat'] == 'kivonat' ||
				   //$this->request->data['Bizonylat']['kivonat'] == 'teljeskivonat' || ez nem kell más szerkezető az SQL
				   $this->request->data['Bizonylat']['kivonat'] == 'fokonyvi'){
				//kivonat lekérdezés
				
				//debug($lekerdezett);
				/* Array(
					[0] => Array(
						[0] => Array(
                    [osztalyId] => 11
                    [osztaly] => Bhakta program
                    [szamlaId] => 64
                    [szamlaSzam] => 312
                    [szamla] => Elszámolások munkavállalókkal, egyházi személyekkel
                    [tForgalom] => 14383.00
                    [kForgalom] => 7510.00
						))
				*/
				//a lekérdezésünk vissza fog adni olyan számlákat is amelyek kívül esnek a tartományon, de az ellenszámla beleesik. Ezeket ki kell szűrni

				$szamlak = array();
				foreach($sz as $szamla){
					$szamlaIdk[] = $szamla['TartozikSzamla']['id'];
				}
				//debug($szamlaIdk);

				$i = $_osztalyId = 0;
				foreach($lekerdezett as $l){
					if(isset($l[0]['osztalyId']) && $l[0]['osztalyId'] != $_osztalyId){
						$_osztalyId = $l[0]['osztalyId'];
					}
					if(in_array($l[0]['szamlaId'], $szamlaIdk))
						$tmpLekerdezett[$_osztalyId][] = $l[0];
				}
				$lekerdezett = $tmpLekerdezett;
			}

			$this->set('lekerdezett', $lekerdezett);
			//debug($lekerdezett);
			$this->set('lekerdezesAdat', array(
											'Bizonylat' => array(
															'osztaly' => array(
																			'tol' => isset($osztalytol)?$osztalytol:null,
																			'ig' => isset($osztalyig)?$osztalyig:null),
															'szamla' => array(
																			'tol' => $this->request->data['Bizonylat']['szamlatol'],
																			'ig' => $this->request->data['Bizonylat']['szamlaig']),
															'datum' => array(
																			'tol' => $datumtol,
																			'ig' => $datumig),
															'szoveg' => $szoveg,
															'kivonat' => isset($this->request->data['Bizonylat']['kivonat']) ? $this->request->data['Bizonylat']['kivonat'] : null,
															'valutas' => isset($this->request->data['Bizonylat']['valutas']) ? $this->request->data['Bizonylat']['valutas'] : null
														  ),
											'Tetel' => array('gyujto' => $gyujto)
										  ));
		}

		if($this->RequestHandler->ext == 'xlsx'){
			//hívjuk meg az excel gyártó metódust
			$this->export('lekerdezes', array('tipus' => $this->request->data['Bizonylat']['kivonat'],
														 'datum' => $datumtol . ' - ' . $datumig,
														 'lekerdezett' => $lekerdezett,
														 'osztalyok' => $osztalyok,
														 'szamlak' => $szamlak,
														 'gyujtok' => $gyujtok));
		}
	}

/* Teljes kivonat - osztályonkénti összesítő lekérdezés SQL
 *
 * @param bool $valutas valutas vagy forintos lekérdezés
 * @param array $join a joinolandó táblák és feltételek
 * @param array $feltetel a figyelembe veendő feltételek
 * @return string SQL query
*/
	private function _createSQL4Teljeskivonat($valutas, $join, $feltetel){
		$sql = 'SELECT IFNULL(osztalyId, oId) AS osztalyId, IFNULL(osztalyKod, oKod) AS osztalyKod,
						IFNULL(osztalyNev, oNev) AS osztalyNev,
						tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
					FROM
						(SELECT osztalyok.id AS osztalyId, osztalyok.kod AS osztalyKod, osztalyok.nev AS osztalyNev,
								SUM(tetelek.osszeg) AS tForgalom'.($valutas?', SUM(valutatetelek.osszeg) AS tValutaForgalom':'').'
							FROM osztalyok, naplok, bizonylatok, tetelek
							LEFT JOIN szamlak AS tartozikSzamlak ON tartozikSzamlak.id = tetelek.t
							'.$join['valuta'].'
							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							AND bizonylatok.id = tetelek.bizonylat_id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							'.$feltetel['datum'].'
							'.$feltetel['osztaly'].'
							AND '.$feltetel['tartozikSzamlak'].'
							'.$feltetel['gyujto'].'
							'.$feltetel['szoveg'].'
							GROUP BY osztalyok.id) AS t1
				
						LEFT JOIN
				
						(SELECT osztalyok.id AS oId, osztalyok.kod AS oKod, osztalyok.nev AS oNev,
								SUM(tetelek.osszeg) AS kForgalom'.($valutas?', SUM(valutatetelek.osszeg) AS kValutaForgalom':'').'
							FROM osztalyok, naplok, bizonylatok, tetelek
							LEFT JOIN szamlak AS kovetelSzamlak ON kovetelSzamlak.id = tetelek.k
							'.$join['valuta'].'
							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							AND bizonylatok.id = tetelek.bizonylat_id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							'.$feltetel['datum'].'
							'.$feltetel['osztaly'].'
							AND '.$feltetel['kovetelSzamlak'].'
							'.$feltetel['gyujto'].'
							'.$feltetel['szoveg'].'
							GROUP BY osztalyok.id) AS t2
				
						ON t1.osztalyId = t2.oId
				
				UNION ALL
				
					SELECT IFNULL(osztalyId, oId) AS osztalyId, IFNULL(osztalyKod, oKod) AS osztalyKod, IFNULL(osztalyNev, oNev) As osztalyNev,
							tForgalom, kForgalom'.($valutas?', tValutaForgalom, kValutaForgalom':'').'
					FROM
					(SELECT osztalyok.id AS osztalyId, osztalyok.kod AS osztalyKod, osztalyok.nev AS osztalyNev,
								SUM(tetelek.osszeg) AS tForgalom'.($valutas?', SUM(valutatetelek.osszeg) AS tValutaForgalom':'').'
							FROM osztalyok, naplok, bizonylatok, tetelek
							LEFT JOIN szamlak AS tartozikSzamlak ON tartozikSzamlak.id = tetelek.t
							'.$join['valuta'].'
							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							AND bizonylatok.id = tetelek.bizonylat_id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							'.$feltetel['datum'].'
							'.$feltetel['osztaly'].'
							AND '.$feltetel['tartozikSzamlak'].'
							'.$feltetel['gyujto'].'
							'.$feltetel['szoveg'].'
							GROUP BY osztalyok.id) AS t3
				
						RIGHT JOIN
				
						(SELECT osztalyok.id AS oId, osztalyok.kod AS oKod, osztalyok.nev AS oNev,
								SUM(tetelek.osszeg) AS kForgalom'.($valutas?', SUM(valutatetelek.osszeg) AS kValutaForgalom':'').'
							FROM osztalyok, naplok, bizonylatok, tetelek
							LEFT JOIN szamlak AS kovetelSzamlak ON kovetelSzamlak.id = tetelek.k
							'.$join['valuta'].'
							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							AND bizonylatok.id = tetelek.bizonylat_id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							'.$feltetel['datum'].'
							'.$feltetel['osztaly'].'
							AND '.$feltetel['kovetelSzamlak'].'
							'.$feltetel['gyujto'].'
							'.$feltetel['szoveg'].'
							GROUP BY osztalyok.id) AS t4
				
						ON t3.osztalyId = t4.oId
				
						WHERE t3.osztalyId IS NULL
						ORDER BY osztalyKod';
		return $sql;
	}

/* Sessionbeli dátum változó beállítása
 *
 * @param date $datum a beállítandó dátum
 * @return nothing
 * @access public
*/
	function setSessionDatum($datum = null, $type = 'Napló'){
		$datum = $datum ? $datum : ($this->request->data['Bizonylat']['datum'] ? $this->request->data['Bizonylat']['datum'] : $this->Session->read('Settings.ev') . '-12-31');
		$type = $this->request->data['Datum']['type'] ? $this->request->data['Datum']['type'] : $type;
		App::uses('EasyDate', 'Utility');
		$easyDate = new EasyDate();
		$easyDate->onErrorReturnCurrentDate = true;
		$datum = $easyDate->change($datum);

		$this->Session->write($type.'.datum', $datum);
		if(!$this->RequestHandler->isAjax())	//nem ajax hívás volt
			$this->redirect('index');
		else{
			$this->set('datum', array(
											//'sikeres' => true,
											'uzenet' => $type . ' dátum átírva: ' . $datum
											  )
						  );
		}
	}

/* pénzkészlet táblázat
 *
 * @param date $date milyen dátumra kérjük le a pénzkészletet?
 * @return nothing
 * @access public
*/
	function penzkeszlet(){
		//kinek hol a mennyi pénze
		set_time_limit(300);	//5 perc után a webszerver így is úgy is lelövi a folyamatot
		//annyi lekérdezést kell indítanunk ahány sorunk van
		$tartomany['penztar'] = 'LEFT(szamlak.szam, 3) = "381"';

		$tartomany['syama'] = 'LEFT(szamlak.szam, 3) = "382"';

		$tartomany['valuta'] = 'LEFT(szamlak.szam, 3) = "383"';

		$tartomany['bank'] = 'LEFT(szamlak.szam, 3) = "384"';

		$tartomany['devizabank'] = 'LEFT(szamlak.szam, 3) = "385"';

		$tartomany['ertekpapir'] = 'LEFT(szamlak.szam, 3) = "386"';

		$tartomany['egyeb'] = 'LEFT(szamlak.szam, 3) = "387"';

		$tartomany['atvezetes'] = 'LEFT(szamlak.szam, 3) = "389"';

		App::uses('EasyDate', 'Utility');
		$easyDate = new EasyDate();
		$easyDate->onErrorReturnCurrentDate = true;

		$date = $this->request->data['Bizonylat']['datum'] ? $easyDate->change($this->request->data['Bizonylat']['datum']) : ($this->Session->read('Kigyűjtés.datum') ? $this->Session->read('Kigyűjtés.datum') : date('Y-m-d'));
		$feltetelek = $date ? 'AND bizonylatok.datum BETWEEN "' . $this->Session->read('Settings.ev') . '-01-01" AND "' . $date .'"' : null;
		$penzkeszlet = array('t'=>array(), 'k'=>array());
		foreach($tartomany as $csoport => $t){
			$sql = 'SELECT osztalyok.id AS osztalyId, szamlak.szam AS szamlaSzam, SUM(osszeg) AS osszeg, (tetelek.t = szamlak.id) AS tartozik
					FROM tetelek
					LEFT JOIN szamlak
							ON ( tetelek.t = szamlak.id OR tetelek.k = szamlak.id )
					LEFT JOIN bizonylatok
							ON tetelek.bizonylat_id = bizonylatok.id
					LEFT JOIN osztalyok
							ON osztalyok.id = bizonylatok.osztaly_id
					WHERE ' . $t . '
					AND bizonylatok.osztaly_id = osztalyok.id

					AND osztalyok.id IN (
												SELECT osztalyok.id
													FROM osztalyok
												LEFT JOIN gyujtok_osztalyok
													ON gyujtok_osztalyok.osztaly_id = osztalyok.id
												WHERE gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
												AND osztalyok.ev = '.$this->Session->read('Settings.ev').'
												)

					AND tetelek.spec != "d"
					AND bizonylatok.spec != "d"
					' . $feltetelek . '
					GROUP BY osztalyId, tartozik';
			//debug($sql);
			$lista = $this->Bizonylat->query($sql);
			//debug($lista);
			foreach($lista as $l){
				if(!isset($penzkeszlet[$csoport][$l['osztalyok']['osztalyId']])){
					if($l[0]['tartozik'])
						$penzkeszlet[$csoport][$l['osztalyok']['osztalyId']] = array(
																									'osszeg' => $l[0]['osszeg'],
																									'szamla' => $l['szamlak']['szamlaSzam']
																									);
					else
						$penzkeszlet[$csoport][$l['osztalyok']['osztalyId']] = array(
																									'osszeg' => -1*$l[0]['osszeg'],
																									'szamla' => $l['szamlak']['szamlaSzam']
																									);
				}
				elseif($l[0]['tartozik'])
					$penzkeszlet[$csoport][$l['osztalyok']['osztalyId']]['osszeg'] += $l[0]['osszeg'];
				else
					$penzkeszlet[$csoport][$l['osztalyok']['osztalyId']]['osszeg'] -= $l[0]['osszeg'];
			}
		}
	//debug($penzkeszlet);
//	$this->set('penzkeszlet', $penzkeszlet);

	//osztály lista
	//a joinolt táblában lévő feltétel miatt újra kell a modelleket kötni a szűrt adatok szerint http://teknoid.wordpress.com/2008/08/06/habtm-and-join-trickery-with-cakephp/#
	$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
	$this->Bizonylat->Osztaly->unbindModel($this->Cegosztaly->getunBindArray(array('User')));
	$this->Bizonylat->Osztaly->bindModel($this->Cegosztaly->getBindArray($this->Session->read('Settings.cegId')));
	$osztalyok = $this->Bizonylat->Osztaly->find(
															'all',
															array(
																'fields' => array('id', 'nev', 'kod', 'elkulonitett'),
																'conditions' => array(
																						'ev' => array(0, $this->Session->read('Settings.ev')),
																						'Osztaly.id' => $oIds
																						),
																'order' => array('kod')
																)
															);

	$osztalyokIgazgatosagonkent = $this->Igazgatosag->getOsztalyokIgazgatosagonkent($osztalyok);
	$igazgatosagok = $this->Igazgatosag->getIgazgatosagok();
	//debug($osztalyokIgazgatosagonkent);

	foreach ($osztalyok as $o) {
		//minden tartományban legyenek adatok, ha nincs tétel akkor egy 0
		foreach($tartomany as $csoport => $t) {
			if (!isset($penzkeszlet[$csoport][$o['Osztaly']['id']]['osszeg'])) {
				$penzkeszlet[$csoport][$o['Osztaly']['id']]['osszeg'] = 0;
			}
			if (!isset($penzkeszlet[$csoport][$o['Osztaly']['id']]['szamla'])) {
				$penzkeszlet[$csoport][$o['Osztaly']['id']]['szamla'] = '';
			}
		}
	}
	//debug($penzkeszlet);
	/*
	[valuta] => Array(
            [263] => Array(		//ez az osztalyIds
                    [osszeg] => -24000
                    [szamla] => 3835)
            [267] => Array(
                    [osszeg] => -91000
                    [szamla] => 3835)
	*/

	$this->set('penzkeszlet', $penzkeszlet);

	$this->set('osztalyok', $osztalyok);
	$this->set('igazgatosagok', $igazgatosagok);
	$this->set('osztalyokIgazgatosagonkent', $osztalyokIgazgatosagonkent);
	$this->set('syama', $this->Session->read('Settings.cegId') == 2 ? true : false);
	}

/* cashstate táblázat
 *
 * @return nothing
 * @access public
*/

function cashstate(){
	if($this->RequestHandler->isAjax()) {
		$this->Bizonylat->query('START TRANSACTION');
		$ev = $this->Session->read('Settings.ev');
		foreach($this->request->data as $d) {
			if($d['Tetel'][0]['osszeg'] == 0) {
				continue;
			}
			//$d['Bizonylat']['_method'] = 'POST'; //ez szukseges????
			$naplo = $this->Bizonylat->Naplo->getNaplo($d['Bizonylat']['osztaly_id'], 1/*HUF*/, $ev);
			$d['Bizonylat']['naplo_id'] = $naplo['id'];
			$d['Bizonylat']['user_id'] = $this->Session->read('Auth.User.id');
			$sorszam = $this->Bizonylat->find('first',
													 array(
															 'fields' => 'sorszam',
															 'order' => 'sorszam DESC',
															 'recursive' => -1,
															 'conditions' => array('Bizonylat.naplo_id' => $naplo['id'])));
			$d['Bizonylat']['sorszam'] = $sorszam['Bizonylat']['sorszam'] + 1;

			App::uses('EasyDate', 'Utility');
			$easyDate = new EasyDate();
			$easyDate->onErrorReturnCurrentDate = true;
			$d['Bizonylat']['datum'] = $easyDate->change();
			$d['Bizonylat']['megjegyzes'] = 'cashstate pénzcsere';
			if($d['Tetel'][0]['osszeg'] > 0) {
				$d['Tetel'][0]['k'] = 170;
				$d['Tetel'][0]['t'] = $d['Tetel'][0]['account'];
			} else {
				$d['Tetel'][0]['k'] = $d['Tetel'][0]['account'];
				$d['Tetel'][0]['t'] = 170;
				$d['Tetel'][0]['osszeg']*= -1;
			}
			$d['Tetel'][0]['szoveg'] = '';
			$this->Bizonylat->create();
			if(!$this->Bizonylat->rogzit($d, $this->Session->read('Settings'), false)){	//sikertelen mentés
				$this->Bizonylat->query('ROLLBACK');
				$this->set('bizonylat', array(
					'sikeres' => false,
					'uzenet' => 'Sikertelen módosítás. cashstate() hiba'
				));
				$this->render();	//rendereljük le az ajax választ a sikertelen rögzítésekről
				return;
			}
		}
		$this->Bizonylat->query('COMMIT');
		$this->set('bizonylat', array(
			'sikeres' => true,
			'uzenet' => 'Sikeres módosítás'
		));
		$this->render();	//rendereljük le az ajax választ a sikeres rögzítésekről
		return;
	}

	//kinek hol a mennyi pénze
	set_time_limit(300);	//5 perc után a webszerver így is úgy is lelövi a folyamatot

	$tartomany['penztar'] = 'LEFT(szamlak.szam, 3) = "381"';

	$tartomany['syama'] = 'LEFT(szamlak.szam, 3) = "382"';

	$tartomany['egyeb'] = '(LEFT(szamlak.szam, 3) = "383" OR
							LEFT(szamlak.szam, 3) = "384" OR
							LEFT(szamlak.szam, 3) = "385" OR
							LEFT(szamlak.szam, 3) = "387")';

	$cashstate = array();

	foreach($tartomany as $csoport => $t){
		$sql = 'SELECT
				osztalyok.id AS osztalyId,
				szamlak.szam AS szamlaSzam,
				szamlak.nev AS szamlaNev,
				szamlak.id AS szamlaId,
				naplok.valuta_id AS valutaId,
				SUM(tetelek.osszeg) AS tetelOsszeg,
				SUM(valutatetelek.osszeg) AS valutatetelOsszeg,
				(tetelek.t = szamlak.id) AS tartozik
						FROM tetelek
						LEFT JOIN szamlak
								ON ( tetelek.t = szamlak.id OR tetelek.k = szamlak.id )
						LEFT JOIN bizonylatok
								ON tetelek.bizonylat_id = bizonylatok.id
						LEFT JOIN osztalyok
								ON osztalyok.id = bizonylatok.osztaly_id
						LEFT JOIN naplok
								ON naplok.id = bizonylatok.naplo_id
						LEFT JOIN valutatetelek
								ON tetelek.id = valutatetelek.tetel_id
						WHERE ' . $t . '
						AND osztalyok.id IN (
													SELECT osztalyok.id
														FROM osztalyok
													LEFT JOIN gyujtok_osztalyok
														ON gyujtok_osztalyok.osztaly_id = osztalyok.id
													WHERE gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
													AND osztalyok.ev = '.$this->Session->read('Settings.ev').'
													)

						AND tetelek.spec != "d"
						AND bizonylatok.spec != "d"
						GROUP BY szamlaSzam, osztalyId, tartozik
						ORDER BY szamlaSzam';

		//	debug($sql);
		$lista = $this->Bizonylat->query($sql);
		//	debug($lista);
		foreach($lista as $l){
			if(!isset($cashstate[$csoport][$l['szamlak']['szamlaSzam']])){
				$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaNev'] = $l['szamlak']['szamlaNev'];
				$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaId'] = $l['szamlak']['szamlaId'];
				$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['valutaId'] = $l['naplok']['valutaId'];
			}

			if(!isset($cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaOsszegek'][$l['osztalyok']['osztalyId']])){
				if($l[0]['tartozik']) {
					$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaOsszegek'][$l['osztalyok']['osztalyId']] =
						($l['naplok']['valutaId']=="1" || $l['naplok']['valutaId']=="3") ? $l[0]['tetelOsszeg'] : $l[0]['valutatetelOsszeg'];
				}
				else {
					$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaOsszegek'][$l['osztalyok']['osztalyId']] =
						-1 * (($l['naplok']['valutaId']=="1" || $l['naplok']['valutaId']=="3") ? $l[0]['tetelOsszeg'] : $l[0]['valutatetelOsszeg']);
				}
			}
			elseif($l[0]['tartozik']) {
				$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaOsszegek'][$l['osztalyok']['osztalyId']] +=
					($l['naplok']['valutaId']=="1" || $l['naplok']['valutaId']=="3") ? $l[0]['tetelOsszeg'] : $l[0]['valutatetelOsszeg'];
			}
			else {
				$cashstate[$csoport][$l['szamlak']['szamlaSzam']]['szamlaOsszegek'][$l['osztalyok']['osztalyId']] -=
					($l['naplok']['valutaId']=="1" || $l['naplok']['valutaId']=="3") ? $l[0]['tetelOsszeg'] : $l[0]['valutatetelOsszeg'];
			}
		}
	}
//	debug($cashstate);
	$this->set('cashstate', $cashstate);

	//osztály lista
	//a joinolt táblában lévő feltétel miatt újra kell a modelleket kötni a szűrt adatok szerint http://teknoid.wordpress.com/2008/08/06/habtm-and-join-trickery-with-cakephp/#
	$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
	$this->Bizonylat->Osztaly->unbindModel($this->Cegosztaly->getunBindArray());
	$this->Bizonylat->Osztaly->bindModel($this->Cegosztaly->getBindArray($this->Session->read('Settings.cegId')));
	$osztalyok = $this->Bizonylat->Osztaly->find(
															'all',
															array(
																'fields' => array('id', 'nev', 'kod', 'elkulonitett'),
																'conditions' => array(
																						'ev' => array(0, $this->Session->read('Settings.ev')),
																						'Osztaly.id' => $oIds
																						),
																'order' => array('kod')
																//'recursive' => -1
															)
															);
//	debug($osztalyok);

	$this->set('osztalyok', $osztalyok);
	$this->set('syama', $this->Session->read('Settings.cegId') == 2 ? true : false);

	$valutak = $this->Arfolyam->getArfolyam('AUD,BGN,CAD,CHF,CZK,DKK,EUR,GBP,HRK,IRS,NOK,PLN,RON,SEK,UAH,USD');
//	debug($valutak);
	$this->set('valutak', $valutak);
	}


/* ue-k listája osztályonként
 *
 * @access public
*/
	function ue(){
		$ueSzamlaSzam = 312;		//todo HC
		
		App::uses('EasyDate', 'Utility');
		$easyDate = new EasyDate();
		$easyDate->onErrorReturnCurrentDate = true;
		$datum = $this->request->data['Bizonylat']['datum'] ? $easyDate->change($this->request->data['Bizonylat']['datum']) : ($this->Session->read('Kigyűjtés.datum') ? $this->Session->read('Kigyűjtés.datum') : date('Y-m-d'));

		//melyik osztályokhoz fér hozzá a user?
		$oszt = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		$oIdk = '';
		foreach($oszt as $o){
			$oIdk .= $o . ',';
		}
		$oIdk = substr($oIdk, 0, -1);	//lecsapjuk a végéről az utolsó vesszőt

		$sql = 'SELECT id, kod, nev, tartozikOsszeg, kovetelOsszeg
					FROM (

						(SELECT osztalyok.id, osztalyok.kod, osztalyok.nev
							FROM osztalyok, gyujtok_osztalyok
							WHERE gyujtok_osztalyok.osztaly_id = osztalyok.id
							AND osztalyok.id IN ('.$oIdk.')
							AND gyujtok_osztalyok.gyujto_id = '.$this->Session->read('Settings.cegId').'
							AND osztalyok.ev IN (0, '.$this->Session->read('Settings.ev').')
						) AS o

						LEFT JOIN

						(SELECT osztalyok.id AS osztalyId, SUM(tetelek.osszeg) AS tartozikOsszeg
							FROM osztalyok, naplotipusok, naplok, bizonylatok, tetelek

							LEFT JOIN szamlak AS tartozikSzamlak ON tartozikSzamlak.id = tetelek.t

							WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
							AND naplok.naplotipus_id = naplotipusok.id
							AND bizonylatok.naplo_id = naplok.id
							AND bizonylatok.osztaly_id = osztalyok.id
							AND bizonylatok.spec != "d"
							AND tetelek.spec != "d"
							AND bizonylatok.id = tetelek.bizonylat_id
							AND tartozikSzamlak.szam = '.$ueSzamlaSzam.'
							AND bizonylatok.datum <= "'.$datum.'"
							GROUP BY osztalyId, t
						) AS t

						ON o.id = t.osztalyId

				)

				LEFT JOIN

					(SELECT osztalyok.id AS osztalyId, SUM(tetelek.osszeg) AS kovetelOsszeg
						FROM osztalyok, naplotipusok, naplok, bizonylatok, tetelek

						LEFT JOIN szamlak AS kovetelSzamlak ON kovetelSzamlak.id = tetelek.k

						WHERE naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
						AND naplok.naplotipus_id = naplotipusok.id
						AND bizonylatok.naplo_id = naplok.id
						AND bizonylatok.osztaly_id = osztalyok.id
						AND bizonylatok.spec != "d"
						AND tetelek.spec != "d"
						AND bizonylatok.id = tetelek.bizonylat_id
						AND kovetelSzamlak.szam = '.$ueSzamlaSzam.'
						AND bizonylatok.datum <= "'.$datum.'"
						GROUP BY osztalyId, k
					) AS k

				ON o.id = k.osztalyId
				ORDER BY kod';
		$this->set('ue', $this->Bizonylat->query($sql));
	}

/* K/T lista osztályonként
 *
 * @access public
*/
	function kt(){
		//melyik osztályokhoz fér hozzá a user?
		$oszt = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		$oIdk = '';
		//debug($oszt);
		foreach($oszt as $o){
			$oIdk .= $o . ',';
		}
		$oIdk = substr($oIdk, 0, -1);	//lecsapjuk a végéről az utolsó vesszőt

		$tartomany['vevo'] = 'LEFT(szamlak.szam, 3) = "311"';

		$tartomany['adottKolcson'] = 'LEFT(szamlak.szam, 3) = "364" OR LEFT(szamlak.szam, 3) = "365"';

		$tartomany['kapottKolcson'] = 'LEFT(szamlak.szam, 3) = "451" OR LEFT(szamlak.szam, 3) = "452"';

		$tartomany['szallito'] = 'LEFT(szamlak.szam, 3) = "454"';

		App::uses('EasyDate', 'Utility');
		$easyDate = new EasyDate();
		
		$date = $this->request->data['Bizonylat']['datum'] ? $easyDate->change($this->request->data['Bizonylat']['datum']) : ($this->Session->read('Kigyűjtés.datum') ? $this->Session->read('Kigyűjtés.datum') : date('Y-m-d'));
		$feltetelek = $date ? 'AND bizonylatok.datum BETWEEN "' . $this->Session->read('Settings.ev') . '-01-01" AND "' . $date .'"' : null;

		$kt = array();
		foreach($tartomany as $csoport => $t){
			$sql = 'SELECT osztalyok.id AS osztalyId, szamlak.szam AS szamlaSzam, SUM(osszeg) AS osszeg, (tetelek.t = szamlak.id) AS tartozik
					FROM tetelek
					LEFT JOIN szamlak
							ON ( tetelek.t = szamlak.id OR tetelek.k = szamlak.id )
					LEFT JOIN bizonylatok
							ON tetelek.bizonylat_id = bizonylatok.id
					LEFT JOIN osztalyok
							ON osztalyok.id = bizonylatok.osztaly_id
					WHERE (' . $t . ')
					AND bizonylatok.osztaly_id = osztalyok.id

					AND osztalyok.id IN (' . $oIdk . ')

					AND tetelek.spec != "d"
					AND bizonylatok.spec != "d"
					' . $feltetelek . '
					GROUP BY osztalyId, tartozik';
			//debug($sql);
			$lista = $this->Bizonylat->query($sql);
			foreach($lista as $l){
				if(!isset($kt[$csoport][$l['osztalyok']['osztalyId']])){
					if($l[0]['tartozik'])
						$kt[$csoport][$l['osztalyok']['osztalyId']] = array(
																									'osszeg' => $l[0]['osszeg'],
																									'szamla' => $l['szamlak']['szamlaSzam']
																									);
					else
						$kt[$csoport][$l['osztalyok']['osztalyId']] = array(
																									'osszeg' => -1*$l[0]['osszeg'],
																									'szamla' => $l['szamlak']['szamlaSzam']
																									);
				}
				elseif($l[0]['tartozik'])
					$kt[$csoport][$l['osztalyok']['osztalyId']]['osszeg'] += $l[0]['osszeg'];
				else
					$kt[$csoport][$l['osztalyok']['osztalyId']]['osszeg'] -= $l[0]['osszeg'];
			}
		}
		//debug($kt);
		$this->set('kt', $kt);

		//osztály lista
		//a joinolt táblában lévő feltétel miatt újra kell a modelleket kötni a szűrt adatok szerint http://teknoid.wordpress.com/2008/08/06/habtm-and-join-trickery-with-cakephp/#
		$oIds = $this->Bizonylat->User->getOsztalyId($this->Session->read('Auth.User.id'), $this->Session->read('Settings.ev'));
		$this->Bizonylat->Osztaly->unbindModel($this->Cegosztaly->getunBindArray());
		$this->Bizonylat->Osztaly->bindModel($this->Cegosztaly->getBindArray($this->Session->read('Settings.cegId')));
		$osztalyok = $this->Bizonylat->Osztaly->find(
															'all',
															array(
																'fields' => array('id', 'nev', 'kod', 'elkulonitett'),
																'conditions' => array(
																						'ev' => array(0, $this->Session->read('Settings.ev')),
																						'Osztaly.id' => $oIds
																						),
																'order' => array('kod')
																//'recursive' => -1
															)
															);
		//debug($osztalyok);
		$this->set('osztalyok', $osztalyok);
	}

/* listák exportálása excelbe
 *
 * @param string $action a meghívandó tevékenység aminek eredményeként előállítjuk az exportot
 * @param array $data az exportba kerülő adatok
 * @access public
*/
	function export($action = null, $data = null){
		$handledActions = array('lekerdezes', 'beszamolo');
		if(in_array($action, $handledActions) && is_array($data)){
			App::import('Vendor', 'PHPExcel', array('file' => 'PHPExcel.php'));
			App::import('Vendor', 'PHPExcel_IOFactory', array('file' => 'PHPExcel'.DS.'IOFactory.php'));
			App::import('Vendor', 'PHPExcel_Style', array('file' => 'PHPExcel'.DS.'Style.php'));
			App::import('Vendor', 'PHPExcel_Worksheet', array('file' => 'PHPExcel'.DS.'Worksheet.php'));

			$objPHPExcel = new PHPExcel();

			$objPHPExcel->setActiveSheetIndex(0);

			//alap beállítások
			$sheet = $objPHPExcel->getActiveSheet();
			$objPHPExcel->getDefaultStyle()->getNumberFormat()->setFormatCode('# ### ### ##0');

			if($action == 'lekerdezes'){
				//gyujtők
				$gyujto = array();
				foreach($data['gyujtok'] as $ind => $gy){
					$gyujto[$ind] = '';
					foreach($gy as $_gyujto){
						$gyujto[$ind] .= $_gyujto['nev'] . ', ';
					}
					$gyujto[$ind] = substr($gyujto[$ind], 0, -2);	//csapjuk le a végéről az utolsó felesleges , space-t
				}

				// Add some data
				if($data['tipus'] == 'teljeskivonat'){
					//fejléc
					$objPHPExcel = $this->_exportFejlec($objPHPExcel,
																	array(0 => array('Lekérdezés', $data['datum']),
																		  1 => array('Kód', 'Osztály', 'Tartozik', 'Követel', 'Egyenleg')
																		  )
																	);

					//adat tartomány
					foreach($data['lekerdezett'] as $i => $l){
						$s = $i+3;
						$objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow(0, $s, $l[0]['osztalyKod'])
							->setCellValueByColumnAndRow(1, $s, $l[0]['osztalyNev'])
							->setCellValueByColumnAndRow(2, $s, $l[0]['tForgalom'])
							->setCellValueByColumnAndRow(3, $s, $l[0]['kForgalom'])
							->setCellValueByColumnAndRow(4, $s, '=C'.$s.'-D'.$s);
					}

					//öszesítő
					$s++;
					$objPHPExcel = $this->_exportTotal($objPHPExcel, $s);

					//formázások
					$objPHPExcel = $this->_exportFormat($objPHPExcel, $s, 5);

					// Rename sheet
					$objPHPExcel->getActiveSheet()->setTitle($action);
				}
				elseif($data['tipus'] == 'fokonyvi'){
					//fejléc
					$objPHPExcel = $this->_exportFejlec($objPHPExcel,
																	array(0 => array('Lekérdezés', $data['datum']),
																		  1 => array('Számlaszám', 'Számlanév', 'Tartozik', 'Követel', 'Egyenleg')
																		  )
																	);

					//adat tartomány
					foreach($data['lekerdezett'][0] as $i => $l){
						$s = $i+3;
						$objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow(0, $s, $l['szamlaSzam'])
							->setCellValueByColumnAndRow(1, $s, $l['szamla'])
							->setCellValueByColumnAndRow(2, $s, $l['tForgalom'])
							->setCellValueByColumnAndRow(3, $s, $l['kForgalom'])
							->setCellValueByColumnAndRow(4, $s, '=C'.$s.'-D'.$s);
					}

					//öszesítő
					$s++;
					$objPHPExcel = $this->_exportTotal($objPHPExcel, $s);

					//formázások
					$objPHPExcel = $this->_exportFormat($objPHPExcel, $s, 3);

					// Rename sheet
					$objPHPExcel->getActiveSheet()->setTitle($action);
				}
				elseif($data['tipus'] == 'kivonat'){
					$z = 0;
					foreach($data['lekerdezett'] as $l){
						//osztályonként másik sheetet hozunk létre
						if($z)
							$objPHPExcel->createSheet();

						$objPHPExcel->setActiveSheetIndex($z);
						$z++;

						$objPHPExcel->getActiveSheet()->setTitle($l[0]['osztaly']);

						//fejléc
						$objPHPExcel = $this->_exportFejlec($objPHPExcel,
																	array(0 => array($l[0]['osztaly'], $data['datum']),
																		  1 => array('Számlaszám', 'Számlanév', 'Tartozik', 'Követel', 'Egyenleg')
																		  )
																	);

						//adat
						foreach($l as $j => $kivonat){
							$s = $j+3;
							$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $s, $kivonat['szamlaSzam'])
								->setCellValueByColumnAndRow(1, $s, $kivonat['szamla'])
								->setCellValueByColumnAndRow(2, $s, $kivonat['tForgalom'])
								->setCellValueByColumnAndRow(3, $s, $kivonat['kForgalom'])
								->setCellValueByColumnAndRow(4, $s, '=C'.$s.'-D'.$s);
						}

						//összesítő
						$s++;
						$objPHPExcel = $this->_exportTotal($objPHPExcel, $s);

						//formázások
						$objPHPExcel = $this->_exportFormat($objPHPExcel, $s, 'auto');
					}
				}
				elseif($data['tipus'] == 'teteles'){
					$z = 0;
					foreach($data['osztalyok'] as $oId => $oNev){
						//osztályonként másik sheetet hozunk létre
						if($z)
							$objPHPExcel->createSheet();

						$objPHPExcel->setActiveSheetIndex($z);
						$z++;

						$objPHPExcel->getActiveSheet()->setTitle($oNev);
						
						//oszlopszélességek beállítása
						for($columnID = 'A'; $columnID < 'K'; $columnID++){
							$objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
						}
						$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(false)->setWidth(15);
						$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setAutoSize(false)->setWidth(6);

						//fejléc
						$objPHPExcel = $this->_exportFejlec($objPHPExcel,
																	array(0 => array($oNev, $data['datum']),
																		  1 => array()
																		  )
																	);

						//adat
						$sor = 3;
						foreach($data['szamlak'] as $szSzam => $szNev){
							$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $sor,  $szSzam)
								->setCellValueByColumnAndRow(1, $sor,  $szNev);

							$kezdoSor = $sor++;

							$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $sor,  'Sorszám')
								->setCellValueByColumnAndRow(1, $sor,  'Osztály')
								->setCellValueByColumnAndRow(2, $sor,  'Dátum')
								->setCellValueByColumnAndRow(3, $sor,  'Szöveg')
								->setCellValueByColumnAndRow(4, $sor,  'Tétel')
								->setCellValueByColumnAndRow(5, $sor,  'Gyüjtők')
								->setCellValueByColumnAndRow(6, $sor,  'Ellenszámla')
								->setCellValueByColumnAndRow(7, $sor,  'Tartozik')
								->setCellValueByColumnAndRow(8, $sor,  'Követel')
								->setCellValueByColumnAndRow(9, $sor,  'Egyenleg');

							foreach($data['lekerdezett'] as $l){
								if(($l['tetel']['tSzamlaSzam'] == $szSzam || $l['tetel']['kSzamlaSzam'] == $szSzam)
										&& ($oId == $l['tetel']['osztalyId'])){	//ez a tétel az adott számlához tartozik

									$sor++;
									$_ellenSzamla = $_tOsszeg = $_kOsszeg = null;

									//oldal és ellenszámla
									$oldal = ($l['tetel']['tSzamlaSzam'] == $szSzam) ? 't' : 'k';
									$ellenoldal = ($oldal == 't') ? 'k' : 't';
									$_ellenSzamla = $l['tetel'][$ellenoldal . 'SzamlaSzam'] . ' ' . $l['tetel'][$ellenoldal . 'Szamla'];

									//összegek
									if($oldal == 't'){
										$_tOsszeg = $l['tetel']['osszeg'];
										$_kOsszeg = 0;
									}
									else{
										$_tOsszeg = 0;
										$_kOsszeg = $l['tetel']['osszeg'];
									}

									$egyenlegKeplet = ($sor == 5) ? '=H'.$sor.'-I'.$sor : '=J'.($sor-1).'+H'.$sor.'-I'.$sor;
									$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $sor,  $l['tetel']['naploTipusKod'] . $l['tetel']['naploSorszam'] . '/' . $l['tetel']['bizonylatSorszam'])
										->setCellValueByColumnAndRow(1, $sor,  $l['tetel']['osztaly'])
										->setCellValueByColumnAndRow(2, $sor,  $l['tetel']['datum'])
										->setCellValueByColumnAndRow(3, $sor,  $l['tetel']['bizonylatMegjegyzes'])
										->setCellValueByColumnAndRow(4, $sor,  $l['tetel']['tetelSzoveg'])
										->setCellValueByColumnAndRow(5, $sor,  $gyujto[$l['tetel']['tetelId']]?$gyujto[$l['tetel']['tetelId']]:'')
										->setCellValueByColumnAndRow(6, $sor,  $_ellenSzamla)
										->setCellValueByColumnAndRow(7, $sor,  $_tOsszeg)
										->setCellValueByColumnAndRow(8, $sor,  $_kOsszeg)
										->setCellValueByColumnAndRow(9, $sor,  $egyenlegKeplet);
								}
							}

							//összesítő
							$sor++;
							$objPHPExcel = $this->_exportTotal($objPHPExcel, $sor, array(7, 8, 9), $kezdoSor);
							$sor += 2;	//még egy soremelés
						}
					}
				}


			}
			//elseif($action == 'beszamolo'){
			//	//beszámoló teljes export új fájlba
			//
			//	//osztályonként kell egy sheet
			//	$z = 0;
			//	foreach($data[0] as $osztalyKod => $adat){
			//		//osztályonként másik sheetet hozunk létre
			//		if($z)
			//			$objPHPExcel->createSheet();
			//
			//		$objPHPExcel->setActiveSheetIndex($z);
			//		$z++;
			//
			//		$objPHPExcel->getActiveSheet()->setTitle($osztalyKod);
			//
			//		//fejléc elemek
			//		//A1-es cellába az osztály kódja
			//		$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, 1, $osztalyKod);
			//
			//		//adat
			//		foreach($adat as $tablasor => $hoErtek){
			//			foreach($hoErtek as $hoIndex => $ertek){
			//				$sor = array_search($tablasor, $data[1]);
			//				$sor += 3;
			//				$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(($hoIndex+2), $sor, $ertek);
			//			}
			//		}
			//
			//		//a 5. és az 51. sor mögé kell beszúrni egy üres sort
			//	}
			//}
			// Set active sheet index to the first sheet, so Excel opens this as the first sheet
			$objPHPExcel->setActiveSheetIndex(0);

			// Save Excel 2007 file
			$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

			$this->set('objWriter', $objWriter);
			return true;
		}
		else{
			$this->redirect('/');
		}
	}

/*
 * Exportnál fejléc beállítás
 *
 * @param object $objPHPExcel
 * @return objecz $objPHPExcel
*/
	function _exportFejlec($objPHPExcel, $fejlec){
		$sheet = $objPHPExcel->getActiveSheet();
		$sheet->setCellValue('B1', $fejlec[0][0])
				->setCellValue('C1', $fejlec[0][1]);
		foreach($fejlec[1] as $i => $f){
			$sheet->setCellValueByColumnAndRow($i, 2, $f);
		}

		//vastagítás, középre igazítás
		$style = $sheet->getStyle('A1:J4');
		$style->getFont()->setBold(true);
		$style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		$style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
		$sheet->getRowDimension(2)->setRowHeight(25);

		//merge a dátumhoz
		$sheet->mergeCells('C1:E1');
		return $objPHPExcel;
	}

/*
 * Exportnál összesítő beállítás
 *
 * @param object $objPHPExcel
 * @param int $s	a sor száma ahová betesszük az összesítőt
 * @param array $sum mely oszlopokba kell betenni az összesítőt
 * @param int $kezdoSor ettől a srotól kell indítani a SUM képleteket. A 2-esben van a megnvezés, innen indulunk, hogy 0 sor esetén se keletkezzen körkörös hivatkozás
 * @return object $objPHPExcel
*/
	function _exportTotal($objPHPExcel, $s, $sum = array(2, 3, 4), $kezdoSor = 2){
		$objPHPExcel->getActiveSheet()
						->setCellValueByColumnAndRow(0, $s, '')
						->setCellValueByColumnAndRow(1, $s, 'Összesen')
						->setCellValueByColumnAndRow($sum[0], $s, '=SUM('.PHPExcel_Cell::stringFromColumnIndex($sum[0]).$kezdoSor.':'.PHPExcel_Cell::stringFromColumnIndex($sum[0]).($s-1).')')
						->setCellValueByColumnAndRow($sum[1], $s, '=SUM('.PHPExcel_Cell::stringFromColumnIndex($sum[1]).$kezdoSor.':'.PHPExcel_Cell::stringFromColumnIndex($sum[1]).($s-1).')');
		
		$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($sum[2], $s, '='.PHPExcel_Cell::stringFromColumnIndex($sum[0]).$s.'-'.PHPExcel_Cell::stringFromColumnIndex($sum[1]).$s);

		$style = $objPHPExcel->getActiveSheet()->getStyle('A'.$s.':'.PHPExcel_Cell::stringFromColumnIndex($sum[2]).$s);
		$style->getFont()->setBold(true);
		$style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
		$objPHPExcel->getActiveSheet()->getRowDimension($s)->setRowHeight(25);
		$style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
		return $objPHPExcel;
	}

/*
 * Export formázások
*/
	function _exportFormat($objPHPExcel, $s, $a = 'auto'){
		$style = array(
						'borders' => array(
											'outline' => array(
																'style' => PHPExcel_Style_Border::BORDER_MEDIUM,
																'color' => array('argb' => '00000000')
																),
											'inside' => array(
																'style' => PHPExcel_Style_Border::BORDER_THIN,
																'color' => array('argb' => '00000000')
																)
											)
						);
		$objPHPExcel->getActiveSheet()->getStyle('A2:E2')->applyFromArray($style);
		$objPHPExcel->getActiveSheet()->getStyle('A3:E'.($s-1))->applyFromArray($style);
		$objPHPExcel->getActiveSheet()->getStyle('A'.$s.':E'.$s)->applyFromArray($style);

		//szélesség
		if(is_numeric($a))
			$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth($a);
		else
			$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);;
		$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
		$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
		$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
		$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
		return $objPHPExcel;
	}

/*
 * Éves zárás
 *
 * @param bool $makeDumpMessage a dump észítésre való figyelmeztetés már meg lett jelenítve
*/
	function evzaras($lepes = false){
		//todo: HC sok minden
		$this->Bizonylat->Osztaly->unbindModel($this->Cegosztaly->getunBindArray());
		$this->Bizonylat->Osztaly->bindModel($this->Cegosztaly->getBindArray($this->Session->read('Settings.cegId')));
		$osztalyok = $this->Bizonylat->Osztaly->find(
																'all',
																array(
																	'fields' => array('Osztaly.*'),
																	'conditions' => array(
																							'ev' => array(0, $this->Session->read('Settings.ev'))
																							),
																	'order' => 'Osztaly.kod'
																)
																);
		$osztalyIdk = array();
		foreach($osztalyok as $o){
			$osztalyIdk[] = $o['Osztaly']['id'];
		}

		if($lepes == 1){
			//állítsuk be a céghez tartozó minden bizonylatra a zárolt értéket
			$this->Bizonylat->updateAll(
											array('zarolt' => 1),
											array('osztaly_id' => $osztalyIdk)
											);
			//nézzük meg, hogy mely osztályokat akarjuk átvenni
			//debug($osztalyok);
			$this->set('osztalyok', $osztalyok);

			//állítsuk be a naplókra is a zárolt flaget
			$this->Bizonylat->Naplo->updateAll(
														array('lezart' => 1),
														array('ceg_id' => $this->Session->read('Settings.cegId'),
																'ev' => $this->Session->read('Settings.ev'))
														);
		}
		elseif($lepes == 2){
			//a kijelölt osztályokat létrehozzuk, a hozzájuk tartozó pénztár és syama számlaszámokat és naplókat
			//debug($this->request->data);
			$sorszam = 0;
			foreach($this->request->data['Bizonylat']['import'] as $imp){
				if($imp){
					//ezt az id-jű osztályt kijelöltük átemelésre
					$sorszam++;
					$osztaly = $this->Bizonylat->Osztaly->find(
																			'first',
																			array(
																				'conditions' => array('Osztaly.id' => $imp),
																				'recursive' => -1
																				)
																			 );
					//debug($osztaly);
					//az importálni kívánt osztályokat hozzuk létre az új évben
					$data = array(
									'Osztaly' => array(
															'nev' => $osztaly['Osztaly']['nev'],
															'ev' => ($osztaly['Osztaly']['ev'] + 1),
															'kod' => $osztaly['Osztaly']['kod']
															),
									'Gyujto' => array(
															'gyujto' => $this->Session->read('Settings.cegId')
															)
									);
					$this->Bizonylat->Osztaly->create();
					$this->Bizonylat->Osztaly->save($data);
					$this->Bizonylat->Osztaly->createView($this->Bizonylat->Osztaly->id);

					//hozzuk létre a pénztár számlaszámokat
					$data = array(
									'Szamla' => array(
															'szam' => '381' . $osztaly['Osztaly']['kod'],
															'ev' => ($osztaly['Osztaly']['ev'] + 1),
															'nev' => $osztaly['Osztaly']['nev'] . ' HUF pénztár',
															'ceg_id' => $this->Session->read('Settings.cegId')
															)
									);
					$this->Szamlaegyenleg->Szamla->create();
					$this->Szamlaegyenleg->Szamla->save($data);

					//hozzunk létre pénztár naplókat
					$data = array(
									'Naplo' => array(
															'naplotipus_id' => 1,	//HUF pénztár
															'valuta_id' => 1,			//HUF
															'ev' => ($osztaly['Osztaly']['ev'] + 1),
															'sorszam' => $sorszam,
															'nev' => $osztaly['Osztaly']['nev'],
															'ceg_id' => $this->Session->read('Settings.cegId'),
															'alapertelmezett_osztaly' => $this->Bizonylat->Osztaly->id,
															'alapertelmezett_szamla' => $this->Szamlaegyenleg->Szamla->id
															)
									);
					//debug($data);
					$this->Bizonylat->Naplo->create();
					$this->Bizonylat->Naplo->save($data);

					if($this->Session->read('Settings.cegId') == 2){
						//Krisna-völgy
						//hozzuk létre a syama számlaszámokat és naplókat
						$data = array(
									'Szamla' => array(
															'szam' => '382' . $osztaly['Osztaly']['kod'],
															'ev' => ($osztaly['Osztaly']['ev'] + 1),
															'nev' => $osztaly['Osztaly']['nev'] . ' SY pénztár',
															'ceg_id' => $this->Session->read('Settings.cegId')
															)
									);
						$this->Szamlaegyenleg->Szamla->create();
						$this->Szamlaegyenleg->Szamla->save($data);

						//hozzunk létre pénztár naplókat
						$data = array(
									'Naplo' => array(
															'naplotipus_id' => 6,	//Syama pénztár
															'valuta_id' => 3,			//Syama
															'ev' => ($osztaly['Osztaly']['ev'] + 1),
															'sorszam' => $sorszam,
															'nev' => $osztaly['Osztaly']['nev'],
															'ceg_id' => $this->Session->read('Settings.cegId'),
															'alapertelmezett_osztaly' => $this->Bizonylat->Osztaly->id,
															'alapertelmezett_szamla' => $this->Szamlaegyenleg->Szamla->id
															)
									);
						$this->Bizonylat->Naplo->create();
						$this->Bizonylat->Naplo->save($data);
					}
				}
			}

			//valuta pénztár naplók létrehozása - kijelölés
			//HUF és deviza bank naplók létrehozása - kijelölés
			$this->Bizonylat->Naplo->unbindModel(array('hasMany' => array('Bizonylat')));
			$naplo = $this->Bizonylat->Naplo->find(
												'all',
												array(
													'conditions' => array(
																				'ceg_id' => $this->Session->read('Settings.cegId'),
																				'ev' => $this->Session->read('Settings.ev'),
																				'naplotipus_id NOT IN (1, 6)'
																				)
													)
												);
			//debug($naplo);
			$this->set('naplo', $naplo);
		}
		elseif($lepes == 3){
			//a 2. lépésben kiválasztott naplók átemelése az új évre
			$this->Bizonylat->Naplo->unbindModel(array('hasMany' => array('Bizonylat'), 'belongsTo' => array('Valuta', 'Naplotipus')));
			$naplok = $this->Bizonylat->Naplo->find('all',
																array(
																	'conditions' => array('Naplo.id' => $this->request->data['Bizonylat']['import'])
																	));
			//debug($naplok);
			foreach($naplok as $naplo){
				//a naplóhoz tartozó alapértelmezett számlaszám létrehozása
				if($naplo['Naplo']['alapertelmezett_szamla'] > 1){		//van hozzácsatolt számla
					//melyik számla van a nalóhoz csatolva?
					$szamla = $this->Szamlaegyenleg->Szamla->find('first',
																				 array(
																					'conditions' => array('Szamla.id' => $naplo['Naplo']['alapertelmezett_szamla']),
																					'recursive' => -1
																					)
																				 );
					//debug($szamla);
					if($szamla['Szamla']['ev']){
						//ha az alapértelmezett számla ev mezője nem 0, akkor a rekordot másolni kell
						unset($szamla['Szamla']['id']);	//új rekordot rögzítünk
						$szamla['Szamla']['ev'] = ($this->Session->read('Settings.ev') + 1);
						$this->Szamlaegyenleg->Szamla->create();
						$this->Szamlaegyenleg->Szamla->save($szamla);
						$naplo['Naplo']['alapertelmezett_szamla'] = $this->Szamlaegyenleg->Szamla->id;
					}
				}
				//a napló létrehozása - ugyanaz mint az előző évi csak az ev mező változik
				unset($naplo['Naplo']['id']);
				$naplo['Naplo']['ev'] = ($this->Session->read('Settings.ev') + 1);
				//debug($naplo);
				$this->Bizonylat->Naplo->create();
				$this->Bizonylat->Naplo->save($naplo);
			}
		}
		else{
			//nézzük meg, hogy az adott cégben mely 1-4 között lévő számláknak van egyenlege osztályonként
			/*$this->Szamlaegyenleg->unbindModel(array('belongsTo' => array('Gyujto')));
			$szamlaEgyenleg = $this->Szamlaegyenleg->find(
															'all',
															array(
																'conditions' => array('osztaly_id' => $osztalyIdk),
																'order' => array('Szamla.szam')
																)
															);
			//debug($szamlaEgyenleg);

			//az 5-999999999999-ig lévőket összesítve kell megjeleníteni a 493-ra

			//az egyenleggel rendelkező számlákról kérdezzük meg, hogy mely számlára akarja megnyitni és alapértelmezésként ajánljuk fel a mostanit

			//ha olyan számláaszámot ad meg amely jelenleg nem létezik kérjük be a nevét

			//a megadott számlaszámokat tegyük bele az új év számlatükrébe ha nincsenek benne

			//a megnyitott pénztárakhoz és bankokhoz nyissunk meg naplókat a lezárt év osztálykódjai szerinti ajánlással

			//a settings táblában a current year-t növeljük meg

			$this->set('szamlaEgyenleg', $szamlaEgyenleg);*/
		}
		$this->set('lepes', $lepes);
	}
	
/**
 * Hónap lezárása
 * @return nothing
 */
	function honapzaras(){
		if(isset($this->request->data['Bizonylat']['lezarando']['month'])){	//van már elküldött adat
			//a lezárandó hónap utolsó napja és előtti bizonylatok zárolt mezőjét 1-re állítjuk
			$napig = $this->Session->read('Settings.ev') . '-' . $this->request->data['Bizonylat']['lezarando']['month'] . '-01';
			$napig = date('Y-m-t', strtotime($napig));	//utolsó nap
			//debug($napig);
			$naptol = $this->Session->read('Settings.ev') . '-01-01';
			$this->Bizonylat->unbindModel(array('belongsTo' => array('Naplo', 'Osztaly', 'User'), 'hasMany' => array('Tetel')));
			$e = $this->Bizonylat->updateAll(array('zarolt' => true),
												 array('Bizonylat.datum BETWEEN ? AND ?' => array($naptol, $napig)));
			if(!$e)
				$this->Session->setFlash('A hónap lezárása sikertelen!', 'default', array('class' => 'alert'));
			else{
				$this->set('sikeres', true);
				$this->Session->setFlash('Lezártam a ' . __(date('F', mktime(1,1,1,($this->request->data['Bizonylat']['lezarando']['month']),1,$this->Session->read('Settings.ev')))) . ' hónapot.');
			}
		}
		// listázzuk a már lezárt hónapokat
		/*$this->Bizonylat->find('all',
									  array(
											'conditions' => array('Bizonylat.zarolt' => 1,
																		'ceg_id' => $this->Session->read('Settings.cegId'),
																		'ev' => $this->Session->read('Settings.ev'))
											));*/
	}
	
/*
 * Napló sorszám lista
 * @param int $naploId a napló id-je
*/
	function naplolista($naploId) {
		$naploInfo = $this->getNaploInfo($naploId);
		//debug($naploInfo);
		$this->set('naploInfo', $naploInfo);
		
		$naploLista = $this->Bizonylat->query('SELECT bizonylatok.*, tetelek.*, osztalyok.nev
											   FROM naplok, bizonylatok, tetelek, osztalyok
											   WHERE naplok.id = ' . $naploId . ' 
											   AND naplok.id = bizonylatok.naplo_id
											   AND bizonylatok.id = tetelek.bizonylat_id
											   AND osztalyok.id = bizonylatok.osztaly_id');
		$this->set('naploLista', $naploLista);
		//debug($naploLista);
		
		$tIdk = array();
		foreach($naploLista as $t){
			$tIdk[] = $t['tetelek']['id'];
		}
		$_gyujtoLista = $this->Bizonylat->query('SELECT *
											   FROM gyujtok, gyujtok_tetelek
											   WHERE gyujtok_tetelek.gyujto_id = gyujtok.id
											   AND gyujtok_tetelek.tetel_id IN ('.implode(',', $tIdk).')
											   ORDER BY gyujtok_tetelek.tetel_id');
		$gyujtoLista = array();
		foreach($_gyujtoLista as $gy){
			if(!array_key_exists($gy['gyujtok_tetelek']['tetel_id'], $gyujtoLista) || !is_array($gyujtoLista[$gy['gyujtok_tetelek']['tetel_id']])){
				$gyujtoLista[$gy['gyujtok_tetelek']['tetel_id']] = array();
			}
			array_push($gyujtoLista[$gy['gyujtok_tetelek']['tetel_id']], $gy['gyujtok']);
		}
		//debug($gyujtoLista);
		$this->set('gyujtoLista', $gyujtoLista);
		
		$this->Szamla->unbindModel(array('hasMany' => array('TartozikTetel', 'KovetelTetel')));
		$this->Szamla->virtualFields = array('szamesnev' => 'CONCAT(Szamla.szam, " ", Szamla.nev)');
		$szamlak = $this->Szamla->find('list',
									   array(
											'conditions' => array(
																'ev' => array(0, $this->Session->read('Settings.ev')),
																'ceg_id' => array(0, $this->Session->read('Settings.cegId'))
																),
											'fields' => array('Szamla.id', 'Szamla.szamesnev')
											 ));
		//debug($szamlak);
		$this->set('szamlak', $szamlak);
	}
/*
 * Pénzcserék
 * A megadott pénzt lecserélgeti az osztályok között úgy, hogy a megadott osztályé lesz az összes.
 * A cserék a megadott másik pénzben történnek átvezetési számlára könyvelve
 * 
*/
	function penzcsere(){
		//melyik naplóban (pénzben) történik a csere?
		$this->Naplo->unbindModel(array(
										 'belongsTo' => array('Valuta'),
										 'hasMany' => array('Bizonylat')));
		$_naplo = $this->Naplo->query('SELECT naplok.id, naplok.nev, naplotipusok.nev, naplotipusok.kod
									 FROM naplok, naplotipusok
									 WHERE naplok.naplotipus_id = naplotipusok.id
									 AND naplok.ev IN (0, '.$this->Session->read('Settings.ev').')
									 AND naplok.ceg_id = '.$this->Session->read('Settings.cegId').'
									 AND naplotipusok.kod IN ("VP", "DB", "B", "EP")');
		$naplo[381] = 'HUF pénztár';
		$naplo[382] = 'Syama pénztár';
		$csere = $naplo;
		foreach($_naplo as $n){
			$naplo[$n['naplok']['id']] = $n['naplok']['nev'] . ' (' . $n['naplotipusok']['nev'] . ')';
		}
		$this->set('naplok', $naplo);
		$this->set('cseres', $csere);
		$this->set('arfolyamok', array(0=>'átlag',1=>'osztályonkénti',2=>'-megadott'));		//osztályonkénti: osztályonként kalkulált átlag,
																							//megadott: user által megadott,
																							//átlag: napló zárás alapján számított összesített átlag
		
		$params = array('ev' => $this->Session->read('Settings.ev'), 'cegId' => $this->Session->read('Settings.cegId'));

		//melyik osztály lesz a befogadó?
		$this->set('osztalyok', $this->Bizonylat->Osztaly->getAllInCeg($params));
		
		if(!empty($this->request->data)){	//már van elküldött adat
			//debug($this->request->data);
			$mitCserelunkSzamlaId = false;
			if($this->request->data['Bizonylat']['Naplo'] != 381
					&& $this->request->data['Bizonylat']['Naplo'] != 382){
				$mitCserelunkSzamlaId = $this->Naplo->getSzamla($this->request->data['Bizonylat']['Naplo']);
			}
			$fogadoOsztalyId = $this->request->data['Bizonylat']['Osztaly'];
			$atvezetesiSzamlaId = $this->Szamla->getSzamlaId('3898 Pénzcserék', $params);		//TODO HC
			//TODO HC
			if(!$atvezetesiSzamlaId){
				$this->set('uzenet', array('msgError' => 'Nem találok 3898 - Pénzcserék számlát a számlák között!'));
				return false;
			}
			$csereSzamlaTipus = $this->request->data['Bizonylat']['Csere'];
			$arfolyamTipus = $this->request->data['Bizonylat']['Arfolyam'];
			
			if(!$this->request->data['Bizonylat']['Naplo']){
				$this->set('uzenet', array('msgError' => 'Ki kell választani valamit a "Melyik naplóban cseréljünk?"-ből!'));
				return false;
			}
			
			if($this->request->data['Bizonylat']['Naplo'] == $this->request->data['Bizonylat']['Csere']){
				$this->set('uzenet', array('msgError' => 'Nem lehet a "Melyik naplót rendezzük le?" és a "Mire cseréljünk?" azonos!'));
				return false;
			}

			if(substr($this->request->data['Bizonylat']['penzcsereDatum'], 0, 4) != $this->Session->read('Settings.ev')){
				$this->set('uzenet', array('msgError' => 'A megadott csere dátum: ' . $this->request->data['Bizonylat']['penzcsereDatum'] . ' nem a jelenlegi könyvelési évben (' . $this->Session->read('Settings.ev') . ') van!'));
				return false;
			}
			$d = array('ev' => $this->Session->read('Settings.ev'),
					   'cegId' => $this->Session->read('Settings.cegId'),
					   'userCsoport' =>  $this->Session->read('Auth.User.csoport'),
					   'Bizonylat' => array('datum' => $this->request->data['Bizonylat']['penzcsereDatum']));
			if(!$this->Bizonylat->isLezartDate($d, false)){
				$this->set('uzenet', array('msgError' => 'A megadott csere dátum: ' . $this->request->data['Bizonylat']['penzcsereDatum'] . ' már lezárt időszakban van!'));
				return false;
			}
	
			$feltetel['datum'] = 'AND bizonylatok.datum
						BETWEEN "'.$this->Session->read('Settings.ev').'-01-01'.'"
						AND "'.$this->request->data['Bizonylat']['datumig'].'"';
			$feltetel['osztaly'] = ' AND osztalyok.id != ' . $fogadoOsztalyId;

			if($this->request->data['Bizonylat']['Csere'] == 381)
				$valutaParId = 1;		//TODO HC
			if($this->request->data['Bizonylat']['Csere'] == 382)
				$valutaParId = 3;		//TODO HC
			else{
				$valutaParId = $this->Naplo->getValutaId($this->request->data['Bizonylat']['Csere']);
				if(!$valutaParId){
					$this->set('uzenet', array('msgError' => 'Egyelőre csak HUF és SY pénztárra tudok cserélni, azért van megcsillagozva!'));
					return false;
				}
			}

			$fogadoNaplo = $this->Naplo->getNaplo($fogadoOsztalyId, $valutaParId, $params['ev']);
			//debug($fogadoNaplo);
			$fogadoOsztalyNev = $this->Bizonylat->Osztaly->getNev($fogadoOsztalyId);
			$csereSzamlaParTipus = $this->Szamla->getSzamlaSzam($fogadoNaplo['alapertelmezett_szamla'], $params['ev']);
			
			$isHufOrSyama = true;
			if($mitCserelunkSzamlaId){
				$isHufOrSyama = false;
				$join['valuta'] = 'LEFT OUTER JOIN valutatetelek ON valutatetelek.tetel_id = tetelek.id';
				$feltetel['tartozikSzamlak'] = 'tartozikSzamlak.id = ' . $mitCserelunkSzamlaId;
				$feltetel['kovetelSzamlak'] = 'kovetelSzamlak.id = ' . $mitCserelunkSzamlaId;
				
				$szamlaSzam = $this->Szamla->getSzamlaSzam($mitCserelunkSzamlaId, $params['ev']);
				$naploId = $this->Naplo->getNaploId($mitCserelunkSzamlaId, $params['ev']);
				$valutaId = $this->Naplo->getValutaId($naploId);
				$valutas = in_array($valutaId, array(1, 3, 19)) ? false : true;		//TODO HC
				
				$d['Bizonylat']['naplo_id'] = $naploId;
				if(!$this->Bizonylat->isMonoton($d)){
					$this->set('uzenet', array('msgError' => 'A megadott dátum: ' . $this->request->data['Bizonylat']['penzcsereDatum'] . ' nem monoton a '.$naploId.' id-jű naplóban!'));
					return false;
				}
				$d['Bizonylat']['naplo_id'] = $fogadoNaplo['id'];
				if(!$this->Bizonylat->isMonoton($d)){
					$this->set('uzenet', array('msgError' => 'A megadott dátum: ' . $this->request->data['Bizonylat']['penzcsereDatum'] . ' nem monoton a '.$fogadoNaplo['id'].' id-jű naplóban!'));
					return false;
				}	
	
				//mely osztályoknak van egyenlege a $mitCserelunkSzamlaId számlán és mennyi?
				$sql = $this->_createSQL4Teljeskivonat($valutas, $join, $feltetel);
			}
			elseif($this->request->data['Bizonylat']['Naplo'] == 381
					|| $this->request->data['Bizonylat']['Naplo'] == 382){	//HUF-t vagy Syamot vagy termékjegyet cserélünk

				$valutas = false;
				$valutaId = ($this->request->data['Bizonylat']['Naplo'] == 381) ? 1 : 3;		//TODO HC
				
				$feltetel['tartozikSzamlak'] = 'LEFT(tartozikSzamlak.szam, 3) = ' . $this->request->data['Bizonylat']['Naplo'];
				$feltetel['kovetelSzamlak'] = 'LEFT(kovetelSzamlak.szam, 3) = ' . $this->request->data['Bizonylat']['Naplo'];

				$sql = $this->_createSQL4Teljeskivonat($valutas, array('valuta' => ''), $feltetel);
			}
			else{
				$this->set('uzenet', array('msgError' => 'Kezeletlen napló: ' . $this->request->data['Bizonylat']['Naplo'] . '!'));
				return false;
			}
			//debug($sql);
			$osztalyForgalom = $this->Bizonylat->query($sql);
			//debug($osztalyForgalom);die();
			/*
			(int) 6 => array(
				(int) 0 => array(
					'osztalyId' => '344',
					'osztalyKod' => '90',
					'osztalyNev' => 'Farm exta laksmi',
					'tForgalom' => '2397752.00',
					'kForgalom' => '2606552.04',
					'tValutaForgalom' => '8859.57',
					'kValutaForgalom' => '8839.57')),
			*/
			foreach($osztalyForgalom as $o){	//átlag árfolyam számítása
				$forgalom['t'] += $o[0]['tForgalom'];
				$forgalom['k'] += $o[0]['kForgalom'];
				if($valutas){
					$forgalom['tValuta'] += $o[0]['tValutaForgalom'];
					$forgalom['kValuta'] += $o[0]['kValutaForgalom'];
				}
			}
			$atlagArfolyam = $valutas ? (($forgalom['t'] / $forgalom['tValuta']) + ($forgalom['k'] / $forgalom['kValuta'])) / 2 : 1;
			//debug($atlagArfolyam);	293.00759211055
			
			$sorszam = 0;
			$arfolyam = 1;
			foreach($osztalyForgalom as $o){
				$sorszam++;
				$osszegHuf = $huf = $o[0]['tForgalom']-$o[0]['kForgalom'];
				
				//HUF és Syama esetében nincs meg minden adat, mert osztályonként változik
				if($isHufOrSyama){
					$_naplo = $this->Naplo->getNaplo($o[0]['osztalyId'], $valutaId, $params['ev']);
					$naploId = $_naplo['id'];
					$mitCserelunkSzamlaId = $this->Naplo->getSzamla($naploId);
				}

				if($valutas){
					$osszegValuta = $o[0]['tValutaForgalom']-$o[0]['kValutaForgalom'];
					$osztalyArfolyam = $osszegHuf / $osszegValuta;
					//debug($osszegHuf / $osszegValuta);
					if($arfolyamTipus == 0){		//átlag
						$arfolyam = $atlagArfolyam;
						$osszegHuf = $osszegValuta * $arfolyam;
					}
					elseif($arfolyamTipus == 1){		//osztályonkénti
						$arfolyam = $osztalyArfolyam;
					}
					else{
					/*elseif($arfolyamTipus == 'megadott')
						$arfolyam = '//TODO';*/
						$uzenet['msgAlert'][] = 'Ezzel az árfolyammal még nem tudok számolni!';
						continue;
					}
					$arfolyamDifi = $arfolyam - $osztalyArfolyam;		//az osztályonkéntinál ez 0
					if($arfolyam < 0 || $osztalyArfolyam < 0){
						$uzenet['msgAlert'][] = 'Az árfolyam negatív a(z) ' . $o[0]['osztalyNev'] . ' osztályban!';
						continue;
					}
					if($osszegHuf != 0 && $osszegValuta != 0
							&& ($arfolyam == 0 || $osztalyArfolyam == 0)){
						$uzenet['msgAlert'][] = 'Az árfolyam 0 a(z) ' . $o[0]['osztalyNev'] . ' osztályban!';
						continue;
					}
					if($osszegValuta == 0){
						if($huf != 0)
							$uzenet['msgAlert'][] = 'A valuta összeg 0 a ' . $o[0]['osztalyNev'] . ' osztályban, míg a HUF forgalom ' . number_format($huf, 0, ',', '.') . '!';
						continue;
					}
				}
				
				if($osszegHuf == 0){
					$uzenet['msgAlert'][] = 'A HUF összeg 0 a ' . $o[0]['osztalyNev'] . ' osztályban!';
					continue;
				}


				if($valutas){
					$valutatetel = array(
									'osszeg' => abs($osszegValuta),
									'arfolyam' => $arfolyam,
									'valuta_id' => $valutaId);
				}
				else{
					$valutatetel = null;
				}
	
				//for 0 and 1
				if($osszegHuf > 0){
					$t = $atvezetesiSzamlaId;
					$k = $mitCserelunkSzamlaId;
				}
				else{
					$t = $mitCserelunkSzamlaId;
					$k = $atvezetesiSzamlaId;
				}
	
				$bizSorszam = $this->Bizonylat->getLastFromNaplo($naploId);
				$bizSorszam = $bizSorszam['sorszam'];
				//rendezendő osztály, rendezendő naplója (pl bank) [kimenő]
				$bizonylat[0] = array(
						'Bizonylat' => array(
										'naplo_id' => $naploId,
										'osztaly_id' => $o[0]['osztalyId'],
										'user_id' => $this->Session->read('Auth.User.id'),
										'sorszam' => ++$bizSorszam,
										'datum' => $this->request->data['Bizonylat']['penzcsereDatum'],
										'arfolyam' => $arfolyam,
										'megjegyzes' => 'PCS / ' . $sorszam
										),
						'Tetel' => array(
										0 => array(
											'sorszam' => 0,
											'szoveg' => '[' . $csereSzamlaTipus . ': ' . $fogadoOsztalyNev . ']',
											'osszeg' => abs($osszegHuf),
											't' => $t,
											'k' => $k,
											'Valutatetel' => $valutatetel
											)
										)
						);
				$bSorszam[$naploId] = $bizSorszam;
				//debug($bizonylat[0]);
				/*
				array(
					'Bizonylat' => array(
						'naplo_id' => '747',
						'osztaly_id' => '310',
						'user_id' => '1',
						'sorszam' => (int) 0,
						'datum' => '2013-12-31',
						'arfolyam' => (float) 290.0389320986,
						'megjegyzes' => 'Pénzcsere 381'
					),
					'Tetel' => array(
						(int) 0 => array(
							'sorszam' => (int) 0,
							'szoveg' => 'pénzcsere',
							'osszeg' => (float) 334499,
							't' => (int) 2468,
							'k' => (int) 2033,
							'Valutatetel' => array(
								'osszeg' => (float) 1153.29,
								'arfolyam' => (float) 290.0389320986,
								'valuta_id' => '2'))))
				*/

				if($isHufOrSyama){
					$_naplo = $this->Naplo->getNaplo($fogadoOsztalyId, $valutaId, $params['ev']);
					$naploId = $_naplo['id'];
					$bizSorszam = $this->Bizonylat->getLastFromNaplo($naploId);
					$bizSorszam = $bizSorszam['sorszam'];
					$mitCserelunkSzamlaId = $this->Naplo->getSzamla($naploId);
					$szamlaSzam = ($this->request->data['Bizonylat']['Naplo'] == 381) ? 382 : 381;		//TODO HC
					if($osszegHuf > 0){
						$k = $mitCserelunkSzamlaId;
					}
					else{
						$t = $mitCserelunkSzamlaId;
					}
				}
				//ehhez az osztályhoz kerül a rendezendő naplóban (pl bank) [bejövő]
				$bizonylat[1] = array(
						'Bizonylat' => array(
										'naplo_id' => $naploId,
										'osztaly_id' => $fogadoOsztalyId,
										'user_id' => $this->Session->read('Auth.User.id'),
										'sorszam' => ++$bizSorszam,
										'datum' => $this->request->data['Bizonylat']['penzcsereDatum'],
										'arfolyam' => $arfolyam,
										'megjegyzes' => 'PCS / ' . $sorszam
										),
						'Tetel' => array(
										0 => array(
											'sorszam' => 0,
											'szoveg' => '[' . $csereSzamlaTipus . ': ' . $o[0]['osztalyNev'] . ']',
											'osszeg' => abs($osszegHuf),
											't' => $k,
											'k' => $t,
											'Valutatetel' => $valutatetel
											)
										)
						);
				$bSorszam[$naploId] = $bizSorszam;
				
				//for 2
				$naploPar = $this->Naplo->getNaplo($o[0]['osztalyId'], $valutaParId, $params['ev']);
				$d['Bizonylat']['naplo_id'] = $naploPar['id'];
				if(!$this->Bizonylat->isMonoton($d)){
					$uzenet['msgError'][] = 'A megadott dátum: ' . $this->request->data['Bizonylat']['penzcsereDatum'] . ' nem monoton a '.$naploPar['id'].' id-jű naplóban!';
					continue;
				}
	
				if($osszegHuf > 0){
					$t = $naploPar['alapertelmezett_szamla'];
					$k = $atvezetesiSzamlaId;
				}
				else{
					$t = $atvezetesiSzamlaId;
					$k = $naploPar['alapertelmezett_szamla'];
				}
				if(array_key_exists($naploPar['id'], $bSorszam)){
					$bizSorszam = $bSorszam[$naploPar['id']];
				}
				else{
					$bizSorszam = $this->Bizonylat->getLastFromNaplo($naploPar['id']);
					$bizSorszam = $bizSorszam['sorszam'];
				}
				//rendezendő osztály, mire cseréljük naplóban (pl Syama) [kimenő]
				$bizonylat[2] = array(
						'Bizonylat' => array(
										'naplo_id' => $naploPar['id'],
										'osztaly_id' => $o[0]['osztalyId'],
										'user_id' => $this->Session->read('Auth.User.id'),
										'sorszam' => ++$bizSorszam,
										'datum' => $this->request->data['Bizonylat']['penzcsereDatum'],
										'arfolyam' => 1,
										'megjegyzes' => 'PCS / ' . $sorszam
										),
						'Tetel' => array(
										0 => array(
											'sorszam' => 0,
											'szoveg' => '[' . $szamlaSzam . ': ' . $fogadoOsztalyNev . ']',
											'osszeg' => abs($osszegHuf),
											't' => $t,
											'k' => $k
											)
										)
						);
				$bSorszam[$naploPar['id']] = $bizSorszam;
	
				//for 3
				if($osszegHuf > 0){
					$t = $atvezetesiSzamlaId;
					$k = $fogadoNaplo['alapertelmezett_szamla'];
				}
				else{
					$t = $fogadoNaplo['alapertelmezett_szamla'];
					$k = $atvezetesiSzamlaId;
				}
				if(array_key_exists($fogadoNaplo['id'], $bSorszam)){
					$bizSorszam = $bSorszam[$fogadoNaplo['id']];
				}
				else{
					$bizSorszam = $this->Bizonylat->getLastFromNaplo($fogadoNaplo['id']);
					$bizSorszam = $bizSorszam['sorszam'];
				}
				//ehhez az osztályhoz kerül a mire cseréljük naplóban (pl Syama) [bejövő]
				$bizonylat[3] = array(
						'Bizonylat' => array(
										'naplo_id' => $fogadoNaplo['id'],
										'osztaly_id' => $fogadoOsztalyId,
										'user_id' => $this->Session->read('Auth.User.id'),
										'sorszam' => ++$bizSorszam,
										'datum' => $this->request->data['Bizonylat']['penzcsereDatum'],
										'arfolyam' => 1,
										'megjegyzes' => 'PCS / ' . $sorszam
										),
						'Tetel' => array(
										0 => array(
											'sorszam' => 0,
											'szoveg' => '[' . $szamlaSzam . ': ' . $o[0]['osztalyNev'] . ']',
											'osszeg' => abs($osszegHuf),
											't' => $t,
											'k' => $k
											)
										)
						);
				$bSorszam[$fogadoNaplo['id']] = $bizSorszam;
				
				//debug($bizonylat);
				
				//árfolyamdifi elszámolása
				//árfolyamdifit csak annál az osztálynál számolhatunk akitől kimegy a valuta
				if($valutas && $this->request->data['Bizonylat']['arfolyamDifi'] && $arfolyamDifi){
					$vegyesNaploId = $this->Naplo->getVegyesId($params);
					$bizSorszam = $this->Bizonylat->getLastFromNaplo($vegyesNaploId);
					$bizSorszam = $bizSorszam['sorszam'];
					//876, 976
					$arfolyamSzamlaId = ($arfolyamDifi < 0)
							? $this->Szamla->getSzamlaId('876 Árfolyamveszteség', $params)
							: $this->Szamla->getSzamlaId('976 Árfolyamnyereség', $params);
					if(!$arfolyamSzamlaId){
						$uzenet['msgWarning'][] = 'Hiányzik a 876 Árfolyamveszteség vagy a 976 Árfolyamnyereség számla, nem tudtam lekönyvelni az árfolyamkülönbséget!';
					}
					else{
						if($arfolyamDifi < 0){
							$t = $arfolyamSzamlaId;
							$k = $mitCserelunkSzamlaId;
						}
						else{
							$t = $mitCserelunkSzamlaId;
							$k = $arfolyamSzamlaId;
						}
						$bizonylat[4] = array(
								'Bizonylat' => array(
												'naplo_id' => $vegyesNaploId,
												'osztaly_id' => $o[0]['osztalyId'],
												'user_id' => $this->Session->read('Auth.User.id'),
												'sorszam' => ++$bizSorszam,
												'datum' => $this->request->data['Bizonylat']['penzcsereDatum'],
												'arfolyam' => 1,
												'megjegyzes' => 'PCS / ' . $sorszam
												),
								'Tetel' => array(
												0 => array(
													'sorszam' => 0,
													'szoveg' => 'pénzcsere árfolyamkülönbség [' . $csereSzamlaTipus . ': ' . $fogadoOsztalyNev . '] ' . $osszegValuta . '*' . $arfolyamDifi,
													'osszeg' => intval(abs($osszegValuta * $arfolyamDifi)),
													't' => $t,
													'k' => $k
													)
												)
								);
					}
				}
				
				$mentve = 0;
				$dataSource = $this->Bizonylat->getDataSource();
				$dataSource->begin();
				foreach($bizonylat as $b){
					$mentve += $this->Bizonylat->rogzit($b, $this->Session->read('Settings'), false);
				}
				if($mentve == count($bizonylat)){
					$dataSource->commit();
					$uzenet['msgSuccess'][] = $bizonylat[1]['Tetel'][0]['szoveg'] . ' <---> ' . $bizonylat[2]['Tetel'][0]['szoveg'] . 'csere végrehajtva';
					if(isset($bizonylat[4]))
						$uzenet['msgInfo'][] = 'A(z) ' . $o[0]['osztalyNev'] . ' osztálynál a Vegyes naplóban lekönyveltem ' . number_format(abs($osszegValuta * $arfolyamDifi), 0, ',', '.') . 'Ft árfolyamkülönbséget!';
				}
				else{
					$dataSource->rollback();
					$uzenet['msgError'][] = '"Valami roppant gáz van" típusú pénzcsre hiba történt ezen a környéken! ' . $bizonylat[3]['Tetel'][0]['szoveg'] . '! mentve: ' . $mentve;
				}
			}
			$this->set('uzenet', $uzenet);
		}
	}
}
?>